ありそうで見当たらなかったので、そういうサンプルコードを書いておこうと思いました。

  • 同期モードです。非同期モードは少しコードの分量が増えるので見送りました。
  • #import使っているので、Visual C++限定です。
#define UNICODE
#define _UNICODE
 
#include <iostream>
#include <locale>
 
#import <msxml6.dll>
 
int main()
{
  std::locale loc(std::locale::classic(), "", std::locale::ctype);
  std::wcout.imbue(loc);
  std::wcerr.imbue(loc);
 
  try
  {
    _com_util::CheckError(CoInitializeEx(
      nullptr, COINIT_APARTMENTTHREADED | COINIT_DISABLE_OLE1DDE));
 
    MSXML2::IXMLHTTPRequestPtr xhr(__uuidof(MSXML2::XMLHTTP60));
    xhr->open(
      L"GET",
      L"https://www.google.co.jp/robots.txt",
      VARIANT_FALSE);
    xhr->send();
 
    auto status = xhr->status;
    if (200 <= status && status <= 299)
    {
      std::wcout << xhr->responseText << std::endl;
    }
    else
    {
      std::wcerr << xhr->status << L' ' << xhr->statusText << std::endl;
    }
 
    CoUninitialize(); // RAII化していないのは手抜き。
  }
  catch (const _com_error& e)
  {
    std::wcerr << e.Error() << L' ' << e.ErrorMessage() << std::endl;
  }
}

対比して理解できるよう、VBScriptとJavaScript(共にWSH)で書いたものも置いてきます。C++版のcatch節に相当する部分を欠いているのはご容赦ください。

Set xhr = CreateObject("Msxml2.XMLHTTP.6.0")
xhr.open "GET", "https://www.google.co.jp/robots.txt", False
xhr.send
If 200 <= xhr.status And xhr.status <= 299 Then
  WScript.Echo xhr.responseText
Else
  WScript.Echo xhr.status & " " & xhr.statusText
End If
var xhr = new ActiveXObject("Msxml2.XMLHTTP.6.0")
xhr.open("GET", "https://www.google.co.jp/robots.txt", false);
xhr.send();
if (200 <= xhr.status && xhr.status <= 299) {
  WScript.Echo(xhr.responseText);
} else {
  WScript.Echo(xhr.status + " " + xhr.statusText);
}

HTTPステータスコードが200番台以外だった場合(else側)はhttpstat.usで試しました。こういう、任意のHTTPステータスコードを試せるウェブサービスはほかにもあるようです。

細かい制御が要らないなら、意外と短いコードになるので、Visual C++で使うのもアリではないかと思いました。

MSDNライブラリのリファレンス: IXMLHTTPRequest Members


スポンサード リンク

この記事のカテゴリ

  • ⇒ XMLHttpRequestをVC++で使う例
  • ⇒ XMLHttpRequestをVC++で使う例
  • ⇒ XMLHttpRequestをVC++で使う例
  • ⇒ XMLHttpRequestをVC++で使う例