WinInet APIの利用(その4)関数利用
ファイル操作、メモリ操作はC言語の標準関数を使っています。以下がソースです。コンソールアプリケーションで、main関数で全部書いて、エラー判定等も書いたので少し長いですが掲載します。
見にくい場合は、ソースをダウンロードして見てください。
VC++ 6.0のプロジェクトファイルを以下に置きました。
プロジェクト一式
以下プログラムです。
----------------------------------------------------------------------------------
#include "stdafx.h"
#include <stdio.h>
#include <windows.h>
//WinInet APIを利用する場合(ライブラリは、wininet.libが必要)
#include <wininet.h>
/*
WinInet APIのサンプル(API関数利用版)
HTTPプロトコルでファイルをダウンロードします。
起動時の引数は特にないです。変数szURLとszFileLocalが入力になります。
途中に変数の宣言を入れていますが、基本的にはC言語の書き方で、
WinInet APIの関数以外は、C言語の標準関数を使用しています。
戻り値 正常時:0 エラー時:1以上
*/
int main(int argc, char* argv[])
{
HINTERNET hInet=NULL;
HINTERNET hConn=NULL;
char szURL[80];
char szFileLocal[80];
//インターネット上のファイルを指定(80文字まで)
strcpy(szURL,"http://www.independence-sys.com/weblog/archiveFiles/winInet.lzh");
//ダウンロードするローカルのファイル名(80文字まで)
strcpy(szFileLocal,"c:\\temp\\winInet.lzh");
//Internetに接続する
hInet = InternetOpen("WININET API Ver0.01",INTERNET_OPEN_TYPE_PRECONFIG,NULL,NULL,0);
if(hInet == NULL){
printf("InternetOpen()エラー\n");
return 1;
}
//タイムアウトの設定(必要な場合はInternetSetOpton()を利用して設定する、ここでは例として)
DWORD ms = 5000;
InternetSetOption(hInet, INTERNET_OPTION_CONNECT_TIMEOUT, &ms, sizeof(ms));
InternetSetOption(hInet, INTERNET_OPTION_RECEIVE_TIMEOUT, &ms, sizeof(ms));
char szDomain[80];
//ドメイン名の切り出し
for(unsigned int i=7;i<strlen(szURL);i++){
if(szURL[i] == '/'){
break;
}
}
// "/"なし
if(i==(strlen(szURL)-1)){
printf("入力URLのフォーマットエラー\n");
InternetCloseHandle(hInet);
return 2;
}
memset(szDomain,0x00,sizeof(szDomain));
memcpy(szDomain,szURL+7,i-7);
// HTTPサーバーに接続
hConn = InternetConnect(hInet,szDomain,INTERNET_DEFAULT_HTTP_PORT,NULL,NULL,
INTERNET_SERVICE_HTTP,0,NULL);
if(hConn == NULL){
printf("InternetConnect()エラー\n");
InternetCloseHandle(hInet);
return 3;
}
//リクエストの送信からファイルの取得
HINTERNET hReq = NULL;
DWORD dwSize;
char szFile[BUFSIZ];
char szStatus[100],szLength[100];//100というサイズはとりあえず
int iRet;
//ドメイン名以降を設定(80という数字はとりあえず)
int pos = strlen(szDomain) + strlen("http://");
memset(szFile,0x00,80);
memcpy(szFile,szURL+pos,strlen(szURL)-pos);
// サーバー上で欲しいURLを指定する
hReq = HttpOpenRequest(hConn,"GET",szFile,
NULL, // デフォルトのHTTPバージョン
NULL, // 履歴を追加しない
NULL,
0, NULL);
if(hReq == NULL){
printf("HttpOpenRequest()エラー\n");
InternetCloseHandle(hInet);
return 4;
}
// ヘッダーを要求する
if(HttpSendRequest(hReq, NULL, 0, NULL, 0) != TRUE){
printf("HttpSendRequest()エラー\n");
InternetCloseHandle(hReq);
InternetCloseHandle(hInet);
return 5;
}
//ステータスを取得する
dwSize = 100;
iRet = HttpQueryInfo(hReq,HTTP_QUERY_STATUS_CODE,szStatus,&dwSize,NULL);
if(iRet == 0){
printf("HttpQueryInfo()エラー\n");
InternetCloseHandle(hReq);
InternetCloseHandle(hInet);
return 6;
}
//数値に変換して判定
DWORD dwStatus = atol(szStatus);
if(dwStatus >= HTTP_STATUS_BAD_REQUEST){
printf("Statusエラー %d\n",dwStatus);
InternetCloseHandle(hReq);
InternetCloseHandle(hInet);
return 7;
}
//Content lengthを取得する
dwSize = 100;
iRet = HttpQueryInfo(hReq,HTTP_QUERY_CONTENT_LENGTH,szLength,&dwSize,NULL);
if(iRet == 0){
printf("HttpQueryInfo()エラー\n");
InternetCloseHandle(hReq);
InternetCloseHandle(hInet);
return 8;
}
//データバッファの確保
DWORD dwFileLength = atol(szLength);
unsigned char* szDataBuf = (unsigned char*)malloc(dwFileLength);
if(szDataBuf == NULL){
printf("malloc()エラー\n");
InternetCloseHandle(hReq);
InternetCloseHandle(hInet);
return 9;
}
//ファイルの内容を一括で受信する
iRet = InternetReadFile(hReq,szDataBuf,dwFileLength,&dwSize);
if(iRet == 0){
printf("InternetReadFile()エラー\n");
free(szDataBuf);
InternetCloseHandle(hReq);
InternetCloseHandle(hInet);
return 10;
}
//ローカルファイル作成
FILE* fp = fopen(szFileLocal,"wb");
if(fp == NULL){
printf("fopen()エラー\n");
free(szDataBuf);
InternetCloseHandle(hReq);
InternetCloseHandle(hInet);
return 11;
}
//一括で書き込み
fwrite(szDataBuf,dwFileLength,1,fp);//ここも厳密にはエラーチェックが必要
fclose(fp);
//解放
free(szDataBuf);
//各ハンドルをクローズする
InternetCloseHandle(hReq);
InternetCloseHandle(hConn);
InternetCloseHandle(hInet);
//0で正常終了
return 0;
}
----------------------------------------------------------------------------------
動作確認はしましたが、動作は保証できません。このプログラムを利用しての不具合、不利益には一切の責任を負いかねます。ご了承ください。
Windowsプログラミング関連記事
Posted by nishida at 03:29:44


