まずは、FTPサーバーからファイルをダウンロードするプログラムを
作ります。Windowsのsystemのディレクトリにwininet.dllが存在する
ことを確認してください。
と、まあこんな感じになります。1.wininet.hをインクルードして、wininet.libをリンクする 2.InternetOpen関数でInternet APIを初期化する 3.InternetConnect関数でFTPセッションハンドルを取得する 4.FtpSetCurrentDirectory関数で現在のFTPのディレクトリをセットする 5.FtpGetFile関数でファイルをダウンロードする 6.InternetCloseHandle関数でFTPとインターネットをクローズする
データ型の前についているINという前置詞みたいなものは 当分の間気にしなくても結構です。この他にOUTがついたり 両方ついたりしているものが出てきます。HINTERNET InternetOpen( IN LPCSTR lpszAgent, IN DWORD dwAccessType, IN LPCSTR lpszProxyName, IN LPCSTR lpszProxyBypass, IN DWORD dwFlags );
lpszAgentは、アプリケーションの名前を指定します。
dwAccessTypeには、アクセスタイプを指定します。
次の中から1つを選びます。
INTERNET_OPEN_TYPE_DIRECT | ローカルですべてのホストネームを解決します |
INTERNET_OPEN_TYPE_PRECONFIG | プロキシまたはレジストリから直接コンフィギュレーションを取得します |
INTERNET_OPEN_TYPE_PRECONFIG_WITH_NO_AUTOPROXY | プロキシまたはレジストリから直接コンフィギュレーションを取得します。 スタートアップJScriptやセットアップファイルの使用をさせません |
INTERNET_OPEN_TYPE_PROXY | もしプロキシバイパスリストの供給がなければ 要求をプロキシを通過させます。 |
lpszProxyNameには、プロキシサーバーの名前を指定します。
lpszProxyBypassには、ホストの名前またはIPアドレスのオプショナルリストのアドレスを指定します。
dwFlagsには、関数の行動に影響するオプションを選択します。 INTERNET_FLAG_ASYNC, INTERNET_FLAG_FROM_CACHE, INTERNET_FLAG_OFFLINEの値から 組み合わせで指定できます。
成功すればインターネットハンドル(HINTERNET)が取得できます。
FTP, Gopher, HTTPセッションをオープンします。HINTERNET InternetConnect( IN HINTERNET hInternetSession, IN LPCSTR lpszServerName, IN INTERNET_PORT nServerPort, IN LPCSTR lpszUsername, IN LPCSTR lpszPassword, IN DWORD dwService, IN DWORD dwFlags, IN DWORD dwContext );
成功すればセッションのハンドルを返します。失敗すればNULLを返します。
hInternetSessionには、InternetOpen関数で取得したハンドルを指定します。
lpszServerNameには、ホストネームを指定します。または、(125.0.16.20)などのような IPアドレスを指定します。
nServerPortには接続するサーバーのTCP/IPポート番号を指定します。 次の中から指定することもできます。
INTERNET_DEFAULT_FTP_PORT | FTPサーバーのデフォルトポート(21) |
INTERNET_DEFAULT_GOPHER_PORT | ゴーファーサーバーのデフォルトポート(70) |
INTERNET_DEFAULT_HTTP_PORT | HTTPサーバーのデフォルトポート(80) |
INTERNET_DEFAULT_HTTPS_PORT | HTTPSサーバーのデフォルトポート(443) |
INTERNET_DEFAULT_SOCKS_PORT | SOCKSファイアーウォールサーバーのデフォルト ポート(1080) |
INTERNET_INVALID_PORT_NUMBER | dwServiceで特定されるサービスのデフォルトポート |
lpszUsernameには、ログオンするためのユーザー名を指定します。
lpszPasswordには、ログオンするためのパスワードを指定します。
dwServiceには、サービスのタイプを指定します。次の中から1つを選びます。
INTERNET_SERVICE_FTP | FTPサービス |
INTERNET_SERVICE_GOPHER | ゴーファーサービス |
INTERNET_SERVICE_HTTP | HTTPサービス |
dwFlagsは、使用されるサービスに特異的なフラグです。
dwContextは、コールバックのリターンハンドルのためのアプリケーションコンテキスト を識別するために使われる、アプリケーション定義の値です。
FTPサーバーのワーキングディレクトリを変えます。BOOL FtpSetCurrentDirectory( IN HINTERNET hFtpSession, IN LPCSTR lpszDirectory );
hFtpSessionには、FTPセッションのハンドルを指定します。
lpszDirectoryにはディレクトリ名を指定します。ディレクトリの区切りには バックスラッシュ(日本のコンピュータでは円記号)でもスラッシュでも問題ありません。
FTPサーバーからファイルを取得します。そして新しいローカルファイルを作ります。BOOL FtpGetFile( IN HINTERNET hFtpSession, IN LPCSTR lpszRemoteFile, IN LPCSTR lpszNewFile, IN BOOL fFailIfExists, IN DWORD dwLocalFlagsAndAttributes, IN DWORD dwInternetFlags, IN DWORD dwContext );
hFtpSessionには、FTPセッションのハンドルを指定します。
lpszRemoteFileには、取得したいファイル名を指定します。
lpszNewFileには、ローカルシステムに作りたいファイルの名前を指定します。
fFailIfExistsには、すでにローカルにlpszNewFileが存在するときにどうするかを指定します。 TRUEを指定した場合、すでにファイルが存在するときこの関数は失敗します。(上書きを防ぐ)
dwLocalFlagsAndAttributes新しいファイルの性質を指定します。 これは、CreateFile関数のFILE_ATTTRIBUTE_*と同じです。
dwInternetFlagsには、ダウンロードする時に関数がどのようにファイルを 取り扱うかのフラグです。最初のセットから1つを選択します。
FTP_TRANSFER_TYPE_ASCII | アスキーファイルを転送します。 |
FTP_TRANSFER_TYPE_BINARY | バイナリーファイルを転送します。 ファイルは変化することなく正確に転送されます。 |
FTP_TRANSFER_TYPE_UNKNOWN | デフォルトです。(バイナリー) |
INTERNET_FLAG_TRANSFER_ASCII | アスキーファイルとして転送。 |
INTERNET_FLAG_TRANSFER_BINARY | バイナリーファイルとして転送。 |
第2のセットはキャッシュ関連のフラグです。複数の選択が可能です。これと 第1のセットとの組み合わせとなります。
INTERNET_FLAG_DONT_CACHE | キャッシュに加えません。 |
INTERNET_FLAG_HYPERLINK | ネットワークから再読み込みするかどうかを 決定するとき、サーバーから「期限切れ」または、「最終変更」が戻ってこないときに リロードを強制します。 |
INTERNET_FLAG_MAKE_PRESISTENT | サポートされていません |
INTERNET_FLAG_MUST_CACHE_REQUEST | ファイルがキャッシュできない時、 テンポラリファイルを作ります。 |
INTERNET_FLAG_NEED_FILE | 上に同じ。 |
INTERNET_FLAG_NO_CACHE_WRITE | キャッシュに加えません。 |
INTERNET_FLAG_RELOAD | ダウンロード時キャッシュを使わずサーバーから 行います。 |
INTERNET_FLAG_RESYNCHRONIZE | 最後にダウンロードされたときから 変更があった場合HTTPリソースを再読み込みします。FTPとゴーファーリソースについては すべてを再読み込みします。 |
dwContextには、アプリケーション定義の値を指定します。アプリケーションがすでに InternetSetStatusCallback関数を呼んでいた時のみ使われます。
インターネットハンドルをクローズします。BOOL InternetCloseHandle( IN HINTERNET hInet );
次章から実際にFTPを作ってみます。
Update 19/Jul/1999 By Y.Kumei