開発環境 Microsoft Visual C++ 2010 Express (SP1)
実行環境 Microsoft Windows XP Home Edition (SP3)
プロジェクトの種類 Win32 コンソール アプリケーション
プロジェクト名 WinHttpTest
アプリケーションの種類 コンソール アプリケーション
追加のオプション 空のプロジェクト
文字セット Unicode


WinHttpTest.cpp
#pragma comment(lib, "winhttp.lib")
 
#include <Windows.h>
#include <winhttp.h>
#include <tchar.h>
 
#include <string>
using namespace std;
 
// 関数プロトタイプ宣言
BOOL GetRequest(HINTERNET hSession, LPCWSTR pwszUrl);
BOOL ReadData(HINTERNET hRequest);
 
//==============================================================================
int main()
{
	HINTERNET hSession;
	WCHAR wszUrl[256];
	DWORD data;
	DWORD dwSize = sizeof data;
	BOOL b;
	int i;
 
	// ロケール定義
	_tsetlocale(LC_CTYPE, _T(""));
 
	// WinHTTPの初期化
	hSession = WinHttpOpen(
		L"Sample Application/1.0",		// pwszUserAgent
		WINHTTP_ACCESS_TYPE_DEFAULT_PROXY,	// dwAccessType
		WINHTTP_NO_PROXY_NAME,			// pwszProxyName
		WINHTTP_NO_PROXY_BYPASS,		// pwszProxyBypass
		0);					// dwFlags
	if (hSession == NULL) {
		return 1;
	}
 
	// インターネットオプションの問い合わせ
	b = WinHttpQueryOption(hSession, WINHTTP_OPTION_CONNECT_TIMEOUT, &data, &dwSize);
	if (b) {
		_tprintf(_T("CONNECT_TIMEOUT(msec) = [%u]\n"), data);
	}
 
	while (1) {
		_tprintf(_T("\nURL(Ctrl-Zで終了)>"));
		i = _tscanf_s(_T("%s"), wszUrl, _countof(wszUrl));
		if (i == EOF) break;
		if (i != 1) continue;
		GetRequest(hSession, wszUrl);
	}
 
	// 終了処理
	b = WinHttpCloseHandle(hSession);
	return 0;
}
 
//------------------------------------------------------------------------------
BOOL GetRequest(HINTERNET hSession, LPCWSTR pwszUrl)
{
	HINTERNET hConnect = NULL;
	HINTERNET hRequest = NULL;
	URL_COMPONENTS urlc;
	DWORD dwSize;
	DWORD dw;
	BOOL bRet = FALSE;
	BOOL b;
 
	// URLをホスト名とパスに分割
	ZeroMemory(&urlc, sizeof urlc);
	urlc.dwStructSize = sizeof urlc;
	urlc.dwHostNameLength = (DWORD)-1;
	urlc.dwUrlPathLength = (DWORD)-1;
 
	b = WinHttpCrackUrl(
		pwszUrl,	// pwszUrl
		0,		// dwUrlLength
		0,		// dwFlags
		&urlc);		// lpUrlComponents
	if (!b) {
		return FALSE;
	}
	_tprintf(_T("lpszHostName = [%s]\n"), urlc.lpszHostName);
	_tprintf(_T("dwHostNameLength = [%u]\n"), urlc.dwHostNameLength);
	_tprintf(_T("nPort = [%u]\n"), urlc.nPort);
	_tprintf(_T("lpszUrlPath = [%s]\n"), urlc.lpszUrlPath);
	_tprintf(_T("dwUrlPathLength = [%u]\n"), urlc.dwUrlPathLength);
 
	// 得られた文字数で変数にコピー
	wstring strHostName(urlc.lpszHostName, urlc.dwHostNameLength);
	wstring strUrlPath(urlc.lpszUrlPath, urlc.dwUrlPathLength);
 
	// サーバーへの接続
	hConnect = WinHttpConnect(
		hSession,		// hSession
		strHostName.c_str(),	// pswzServerName
		urlc.nPort,		// nServerPort INTERNET_DEFAULT_PORT
		0);			// dwReserved
	if (hConnect == NULL) {
		dw = GetLastError();
		switch (dw) {
		case ERROR_WINHTTP_INVALID_URL:
			_ftprintf(stderr, _T("WinHttpConnect = [INVALID_URL]\n"));
			break;
		default:
			_ftprintf(stderr, _T("WinHttpConnect = [%u]\n"), dw);
		}
		goto Exit;
	}
 
	// 要求ハンドルの取得
	hRequest = WinHttpOpenRequest(
		hConnect,			// hConnect
		NULL,				// pwszVerb NULL=GET
		strUrlPath.c_str(),		// pwszObjectName
		NULL,				// pwszVersion NULL=HTTP/1.1
		WINHTTP_NO_REFERER,		// pwszReferrer
		WINHTTP_DEFAULT_ACCEPT_TYPES,	// ppwszAcceptTypes
		0);				// dwFlags
	if (hConnect == NULL) {
		dw = GetLastError();
		_ftprintf(stderr, _T("WinHttpOpenRequest = [%u]\n"), dw);
		goto Exit;
	}
 
	// 要求を送信
	b = WinHttpSendRequest(
		hRequest,				// hRequest
		WINHTTP_NO_ADDITIONAL_HEADERS,		// pwszHeaders
		0,					// dwHeadersLength
		WINHTTP_NO_REQUEST_DATA,		// lpOptional
		0,					// dwOptionalLength
		WINHTTP_IGNORE_REQUEST_TOTAL_LENGTH,	// dwTotalLength
		0);					// dwContext
	if (!b) {
		dw = GetLastError();
		_ftprintf(stderr, _T("WinHttpSendRequest = [%u]\n"), dw);
		goto Exit;
	}
 
	// 応答を待つ
	b = WinHttpReceiveResponse(
		hRequest,	// hRequest
		NULL);		// lpReserved
 
	// ヘッダ情報の取得
	dwSize = 0;
	b = WinHttpQueryHeaders(
		hRequest,			// hRequest
		WINHTTP_QUERY_RAW_HEADERS_CRLF,	// dwInfoLevel
		WINHTTP_HEADER_NAME_BY_INDEX,	// pwszName
		NULL,				// lpBuffer
		&dwSize,			// lpdwBufferLength
		WINHTTP_NO_HEADER_INDEX);	// lpdwIndex
	if (!b) {
		dw = GetLastError();
		switch (dw) {
		case ERROR_INSUFFICIENT_BUFFER:
			break;
		default:
			_ftprintf(stderr, _T("WinHttpQueryHeaders = [%u]\n"), dw);
			goto Exit;
		}
	}
 
	LPCWSTR lpHeader = new WCHAR[dwSize / sizeof (WCHAR)];
	b = WinHttpQueryHeaders(hRequest, WINHTTP_QUERY_RAW_HEADERS_CRLF,
		WINHTTP_HEADER_NAME_BY_INDEX, (LPVOID)lpHeader, &dwSize,
		WINHTTP_NO_HEADER_INDEX);
	if (!b) {
		dw = GetLastError();
		_ftprintf(stderr, _T("WinHttpQueryHeaders = [%u]\n"), dw);
		goto Exit;
	}
	_tprintf(_T("lpHeader = [%s]\n"), lpHeader);
	delete [] lpHeader;
 
	// データの読み込み
	ReadData(hRequest);
	bRet = TRUE;
 
Exit:	// 終了処理
	if (hRequest) b = WinHttpCloseHandle(hRequest);
	if (hConnect) b = WinHttpCloseHandle(hConnect);
	return bRet;
}
 
//------------------------------------------------------------------------------
BOOL ReadData(HINTERNET hRequest)
{
	BYTE buffer[4096];
	DWORD dwSize;
	BOOL b;
 
	// 一時的にロケールを変更
	_tsetlocale(LC_CTYPE, _T("C"));
 
	while (1) {
		// 入手可能データのバイト数を取得
		b = WinHttpQueryDataAvailable(hRequest, &dwSize);
		if (dwSize == 0) break;
		if (_countof(buffer) < dwSize) dwSize = _countof(buffer);
 
		// データの読み込み
		b = WinHttpReadData(hRequest, buffer, dwSize, NULL);
		_tprintf(_T("%.*S"), dwSize, buffer);
	}
 
	_tsetlocale(LC_CTYPE, _T(""));
	return TRUE;
}
 
最終更新:2012年09月07日 17:45