C++によるHTTPプログラミング
2013年12月24日:ネットワーク
MFCを使って、HTTPプログラミングをします。
具体的には、GoogleのHTMLファイルをプログラミングを経由してダウンロードします。
プロジェクトの準備
まず、MFCでプロジェクトを準備します。
ダイアローグベースで、Unicodeを使用するのチェックを外してプロジェクトを作成してください。
そして、WinInetライブラリを使用するので
#include “wininet.h”
でインクルードしてください。また、リンクする必要もあるので、
プロジェクトのプロパティ->リンカ->入力->追加の依存ファイル
に「WinInet.Lib」と入力してOKをおします。
次にダイアローグを以下のように作成します。
そして、以下のように設定します。
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ファイルが表示されます。
著者:安井 真人(やすい まさと)
@yasui_masatoさんをフォロー