首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> VC 教學

VC++ 使用 XMLHTTP 物件存取遠端資料完整範例

     編輯:VC 教學

前言

在 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;
}

關鍵點解析

  1. #import 指令:自動從 DLL 產生智慧型指標與型別定義,避免手寫繁瑣的 CoCreateInstance 與 QueryInterface。
  2. 智慧型指標 IXMLHTTPRequestPtr:自動管理參考計數,離開作用域即釋放,防止記憶體洩漏。
  3. 同步與非同步:範例使用同步模式(第三參數 false),適合簡單工具;若需 UI 不凍結,請改為非同步並處理 onreadystatechange 事件。
  4. 編碼處理:回應為 UTF-8 時,_bstr_t 會自動轉為寬字元,直接傳給 MessageBoxW 即可正確顯示中文。

常見問題與對策

  • DLL 路徑不同:Vista/Win7 以上系統 MSXML 通常在 C:\Windows\System32\msxml6.dll,建議用 msxml6.dll 並指定 XMLHTTP60 ProgID。
  • HTTPS 憑證驗證失敗:可在 open 前設定 setOption(SERVER_SSL_CERT_ERRORS, VARIANT_TRUE) 忽略錯誤(僅限測試環境)。
  • Proxy 設定:XMLHTTP 會自動讀取 WinINET/WinHTTP Proxy 設定,通常無需額外程式碼。

延伸應用

同樣架構可輕易擴充為 POST 送出 JSON/XML、加入自訂 Header、處理 Cookie、下載檔案流等進階功能,核心皆圍繞 IXMLHTTPRequest 介面操作。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved