在 Win32/MFC 專案中若需發送 HTTP 請求並取得回應,MSXML 的 IXMLHTTPRequest 介面是最輕量且相容性佳的選擇。本文提供一個可直接編譯執行的最小化範例,示範如何在 VC++ 6.0 以上環境初始化 COM、建立 XMLHTTP 物件、發送 GET 請求並以訊息框顯示回應內容。
// 主程式進入點
#import "C:/Windows/system32/msxml3.dll" named_guids
#import "C:/Windows/system32/msxml6.dll" named_guids
using namespace MSXML2;
#include <stdio.h>
#include <windows.h>
#include <comdef.h>
// COM 初始化輔助函式
HRESULT ComInit()
{
HRESULT hr = CoInitialize(NULL);
if (FAILED(hr))
{
CoUninitialize();
return E_UNEXPECTED;
}
return hr;
}
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
if (FAILED(ComInit())) return -1;
try
{
// 建立 XMLHTTP 物件
IXMLHTTPRequestPtr xmlRequest;
xmlRequest.CreateInstance(__uuidof(MSXML2::XMLHTTP60)); // 或 XMLHTTP30
// 發送同步 GET 請求
_bstr_t url(L"https://www.example.com/api/data");
xmlRequest->open(_bstr_t(L"GET"), url, _variant_t(VARIANT_FALSE));
xmlRequest->send();
// 取得回應文字
BSTR bstrBody;
xmlRequest->get_responseText(&bstrBody);
_bstr_t response(bstrBody);
// 顯示結果
MessageBoxW(NULL, response, L"HTTP 回應", MB_OK | MB_ICONINFORMATION);
}
catch (_com_error &e)
{
MessageBoxW(NULL, e.ErrorMessage(), L"錯誤", MB_OK | MB_ICONERROR);
}
CoUninitialize();
return 0;
}
CoCreateInstance 與 QueryInterface。IXMLHTTPRequestPtr:自動管理參考計數,離開作用域即釋放,防止記憶體洩漏。false),適合簡單工具;若需 UI 不凍結,請改為非同步並處理 onreadystatechange 事件。_bstr_t 會自動轉為寬字元,直接傳給 MessageBoxW 即可正確顯示中文。C:\Windows\System32\msxml6.dll,建議用 msxml6.dll 並指定 XMLHTTP60 ProgID。open 前設定 setOption(SERVER_SSL_CERT_ERRORS, VARIANT_TRUE) 忽略錯誤(僅限測試環境)。同樣架構可輕易擴充為 POST 送出 JSON/XML、加入自訂 Header、處理 Cookie、下載檔案流等進階功能,核心皆圍繞 IXMLHTTPRequest 介面操作。