Skip to main content.

Monday, September 18, 2006

WinInet APIの利用(その5)C#からの呼び出し(FTP)

WinInet APIをC#から呼び出す場合のサンプルを作ってみました。今回はFTPでのファイル転送です。以下のような画面を持つ単純なFTPのテスト的なプログラムです。開発環境は、Visual C# 2005 Express Editionです。ボタンを押した際にアップロードかダウンロードを実行します。スレッドにはなっていません。

実行画面


ポイントはWinInet APIに限らず、Win32APIをC#から呼び出す場合の方法になるかと思います。その一般的な概要、方法等については、例えばですが参考サイトを参照して下さい。ここでは、WinInet APIを呼び出す場合の実際の例で今回のポイントになるかと思われる部分を説明させて下さい。

以下のようにDllImportで使用するAPIを定義します。その際にGetLastError()でエラーが取得出来るように、SetLastError=trueを指定します。そのGetLastError()ですが、DllImportで呼び出すと、エラー番号が正確に取得できないようです。そのため、.NETのMarshal.GetLastWin32Error()を使用します。また、このMarshal.GetLastWin32Error()で取得したエラー番号から、エラーメッセージを取得するために、以下のようにFormatMessage()を定義して利用します。これで、実際のエラー内容が表示出来ます。

[DllImport("wininet.dll", SetLastError = true, CharSet = CharSet.Auto)]
    private static extern IntPtr InternetOpen(
      string strAppName, uint uiAccessType, string strProxy,
      string strProxyBypass, uint uiFlags);

[DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
    private static extern int FormatMessage(
      FormatMessageOptions flags, IntPtr source, int messageId,
      int langId, StringBuilder buffer, int size, IntPtr arguments);
    [Flags]
    private enum FormatMessageOptions
    {
      FromHModule = 0x0800,
      FromSystem = 0x1000,
    }

その他使用したAPI
FTP関連
InternetConnect()
FtpPutFile()
FtpGetFile()
InternetCloseHandle()

DLLのロードとフリー
LoadLibrary()
FreeLibrary()

プログラム全体は、お手数ですがファイルをダウンロードしてご覧下さい。API(関数)を呼び出しているだけと言えばそれだけですので、あまりC#(.NET)らしいプログラムとは言えないかとは思います。これだけであれば、C#でなくても、従来のVC++でも充分かとも思います。ただ、例えば、C#で開発したアプリがあって、そこに簡単なファイル転送の機能を付け加えたいといった場合等で参考になればと思います。

Visual C# 2005 Express Editionのファイル一式を以下に置きました。
プロジェクトファイル一式

動作確認しましたが、動作は保証できません。このプログラムを利用しての不具合、不利益には一切の責任を負いかねます。ご了承ください。

参考サイト
@IT .NET TIPS Win32 APIやDLL関数を呼び出すには?


Windowsプログラミング関連記事