• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:wsock32を利用したFTPクライアントプログラム)

VBAでwsock32を利用したFTPクライアントプログラムの作成方法

このQ&Aのポイント
  • VBAでwsock32を使ったFTPクライアントプログラムの作成方法を解説します。
  • 接続後にrecv関数を使用する際の問題や、send関数での文字列やタイミングの設定方法についても説明します。
  • FTPサーバーへの接続や認証までの手順を解説し、ファイル取得についての基本的な理解を提供します。

質問者が選んだベストアンサー

  • ベストアンサー
  • nda23
  • ベストアンサー率54% (777/1415)
回答No.1

先ず、VBAからWindowsAPIを呼び出す時の感覚ですが、必ずANSIに変換 されますので、StrConv(strCommand, vbFromUnicode) のような処置は 不要です。やるならMultiByteToWideCharを使うべきでしょう。以下の ように文字用とバイナリ用の2個を定義する方が分かり易い。 Declare Function sendA Lib "WS2_32" Alias "send" _ (ByVal S As Long, ByVal B As String, ~ Declare Function sendB Lib "WS2_32" Alias "send" _ (ByVal S As Long, ByRef B As Byte, ~ また、ご存知と思いますが、送信バイト数はAPIのlstrlenを使うべき です。 http://msdn.microsoft.com/ja-jp/library/cc410906.aspx ★DLL内の実名は"lstrlenA"です。 次にFTPは基本的に制御ラインではサーバ側の応答はLFで終わります。 よって、コマンド送信→応答受信(LF検出まで)を1往復と考えて 差し支えありません。つまり、1バイトずつの受信を行い、LFを検出 した所で、受信処理を抜けるような方法を取るべきです。 FTPの制御ラインのサーバ応答は必ず数字3桁+空白1桁なので、先頭の 1桁をチェックし、次を続けるかどうかを判断します。 "1":コマンドを受理した。次に結果の応答がある。 "2":コマンドを受理した。正常に処理された。 "3":コマンドを受理した。次のコマンドを送信せよ。 "4"、"5":コマンドを受理した。成功しなかった。 "USER"コマンドを送信すると、必ず"3"(場合によっては"4"、"5")が 返ります。これは対になるコマンド(認証ではPASS)の送信を催促 するということです。"4"、"5"が返る場合はユーザ名が不許可なので、 PASSコマンドを送っても意味がありません。 尚、WinSockを扱う(定義する)ところを標準モジュールにするのは ヨロシクありません。WinSock内にデータがあり、通信障害の程度に よってはデータが破壊され、修復不可能になることがあります。 標準モジュールは静的なプログラム領域で、ここにロードされたDLLは プロセス終了までリフレッシュできません。 これを回避するため、クラスモジュールに定義し、インスタンスを 明示的に扱うことで解決します。クラスモジュールはインスタンスを 解放する際、プログラム領域も解放するので、ロードされたDLLも解放 されます。再度、インスタンス化することでリフレッシュされます。 先は長いので頑張ってください。

vijareal
質問者

お礼

回答ありがとうございます。 進捗しだいでまた質問するかもしれませんが いったん完了にします。 先は長そうですが、がんばります。 ありがとうございました。

関連するQ&A