C++によるHTTPプログラミング

MFCを使って、HTTPプログラミングをします。

具体的には、GoogleのHTMLファイルをプログラミングを経由してダウンロードします。

プロジェクトの準備

まず、MFCでプロジェクトを準備します。

ダイアローグベースで、Unicodeを使用するのチェックを外してプロジェクトを作成してください。

そして、WinInetライブラリを使用するので

#include “wininet.h”

でインクルードしてください。また、リンクする必要もあるので、

プロジェクトのプロパティ->リンカ->入力->追加の依存ファイル

に「WinInet.Lib」と入力してOKをおします。

次にダイアローグを以下のように作成します。

スクリーンショット_122313_105315_AM

そして、以下のように設定します。

URL入力用エディットコントロール

ID: IDC_EDIT_URL

変数の追加: m_edit_url

ソース出力用エディットコントロール

ID: IDC_EDIT_DISPLAY

MultiLine: True

Want Return: True

Auto HScroll: False

Vertical Scroll: True

変数の追加: m_edit_display

プログラム

では入力したURLのHTMLファイルを表示するプログラムを創ります。

ボタンを押した際の動作を以下のように書きます。

HINTERNET hInet, hUrl;
char szBuf[128],*lpszSrc;
DWORD dwRead,dwTotal=0;
HGLOBAL hMem;
CString ss;
//URLの入力
m_edit_url.GetWindowTextA(ss);
char szUrl[128];
strcpy_s(szUrl,CStringA(ss));
//インターネットの開始
hInet=InternetOpen("test-program",
          INTERNET_OPEN_TYPE_PRECONFIG,
          NULL,NULL,0);
if(hInet==NULL){
     return;
}
//HTTPセッションの開始、指定のURLオープン
hUrl=InternetOpenUrl(hInet,szUrl,NULL,0,0,0);
if(hUrl==NULL){
     return;
}
hMem=GlobalAlloc(GHND,1);
lpszSrc=(char*)GlobalLock(hMem);
while(1){
     InternetReadFile(
     hUrl,szBuf,(DWORD)sizeof(szBuf)-1,&dwRead);
     szBuf[dwRead]='\0';
     if(dwRead==0)break;
     dwTotal += dwRead;
     hMem=GlobalReAlloc(hMem,dwTotal+1,GMEM_MOVEABLE);
     if(hMem==NULL){
          return;
     }
     lpszSrc=(char*)GlobalLock(hMem);
     if(lpszSrc==NULL){
          break;
     }
     strcat_s(lpszSrc,dwTotal+1,szBuf);
}
m_edit_display.SetWindowTextA(lpszSrc);
//メモリの解放
GlobalUnlock(hMem);
GlobalFree(hMem);
//インターネットハンドルの解放
InternetCloseHandle(hUrl);
InternetCloseHandle(hInet);

解説

はじめに、InternetOpen関数でWinInetを初期化します。

HINTERNET InternetOpen(
LPCTSTR lpszAgent,
DWORD dwAccessType,
LPCTSTR lpszProxyName,
LPCTSTR lpszProxyBypass,
DWORD dwFlags);

初期化が成功したら、URLを指定して開きます・

HINTERNET InternetOpenUrl(
HINTERNET hInternet, //InternetOpen関数で取得したハンドル
LPCTSTR lpszUrl, //URLの指定
LPCTSTR lpszHeaders, //lpszUrlの長さを指定
DWORD dwHeadersLength,
DWORD dwFlags,
DWORD_PTR dwContext
);

あとは、データを読んでいきます。

BOOL InternetReadFile(
HINTERNET hFile, //ハンドルの指定
LPVOID lpBuffer, //読み取ったデータの保存先
DWORD dwNumber0fBytesToRead, //読み取るデータのバイト数の指定
LPDWORD lpdwNumber0fBytesRead //実際に読み取ったバイト数を格納
);

成功したらTRUE,失敗したらFALSEを返します。

読み取ったら終了処理をして終わりです。

BOOL WINAPI InternetCloseHandle(
HINTERNET hInternet
);

ためしに

http://google.com

と入力してみてください。以下のようにHTMLファイルが表示されます。

スクリーンショット_122313_112434_AM

著者:安井 真人(やすい まさと)