XMLHTTPRequest를 써보자!

CuveDev | 2009. 1. 18. 15:57 | 큐브씨

AJAX 때문에 유명해진 XMLHTTPRequest 입니다 ^^;
사실 저같은 Windows 개발자들은 http 통신을 하는데 수많은 방법이 있지요.
Win32의 HttpOpenRequest 함수나 MFC의 CHttpConection 클래스, 그리고 WinHttp 등..
(일설에 의하면.. XMLHTTPRequest는 WinHttp 를 래핑해서 만들어졌다고 하는군요.)

따라서 사실 굳이 XMLHTTPRequest 를 쓰지 않아도 됩니다.
비동기 통신? 스레드로 돌리면 간단하지요 -_-;

그럼 왜 하필 이런 코드를 올리느냐!

..그냥 왠지 써보고 싶어서 -_-;
Windows 개발자들은 원래 유행에 덜 민감한 편이고 또 그래야 하죠 ;;
괜히 이런 신기술 쪽을 쓰다보면 구버전의 OS에서는 안돌아가고 막 그러니까요.

그럼에도 불구하고.. 이 넘치는 호기심을 주체하지 못하는지라..
어쨌든 서론은 접어두고, 코드 올라갑니다.
장점이라면.. 도메인과 경로를 분리해서 작업하지 않아도 되고,
비동기 통신을 자체적으로 지원한다는 정도일 것 같네요.
(open 하실 때 세번째 인자를 true 로 주면 된다고 합니다. 해보진 않았지만 ;;)


#import "msxml3.dll"
using namespace MSXML2;

BOOL GetHtml(LPCTSTR tszUrl, LPTSTR tszBuffer,
		 DWORD cbBuffer)
{
	USES_CONVERSION;

	BOOL bRet = FALSE;
	HRESULT hr = S_FALSE;
	IXMLHTTPRequestPtr pIXMLHTTPRequest = NULL;
	_bstr_t bstrHtml = _T("");

	hr = CoInitialize(NULL);
	if (FAILED(hr))
		goto cleanup;
	
	hr = pIXMLHTTPRequest.CreateInstance(
			_T("Msxml2.XMLHTTP.3.0"));
	if (FAILED(hr))
		goto cleanup;

	hr = pIXMLHTTPRequest->open(_T("GET"), tszUrl, false);
	if (FAILED(hr))
		goto cleanup;

	hr = pIXMLHTTPRequest->send();
	if (FAILED(hr))
		goto cleanup;

	bstrHtml = pIXMLHTTPRequest->responseText;
	if (bstrHtml.length() == 0)
		goto cleanup;

	hr = StringCbCopy(tszBuffer, cbBuffer,
			OLE2T(bstrHtml));
	if (FAILED(hr))
		goto cleanup;

	bRet = TRUE;

cleanup:
	pIXMLHTTPRequest.Release();
	CoUninitialize();
	return bRet;
}