首页 > 解决方案 > 如何将 IWinHttpRequest 导入 MSVC++ 项目?

问题描述

我一直在查看 Microsoft 在 COM 上使用 WinHTTP 的示例代码,请参阅:https ://docs.microsoft.com/en-us/windows/win32/winhttp/iwinhttprequest-open

代码的前几行如下:

#include <windows.h>
#include <stdio.h>
#include <objbase.h>

#include "httprequest.h"

#pragma comment(lib, "ole32.lib")
#pragma comment(lib, "oleaut32.lib")

// IID for IWinHttpRequest.
const IID IID_IWinHttpRequest =
{
  0x06f29373,
  0x5c5a,
  0x4b54,
  {0xb0, 0x25, 0x6e, 0xf1, 0xbf, 0x8a, 0xbf, 0x0e}
};

int main()
{
    // Variable for return value
    HRESULT    hr;

    // Initialize COM
    hr = CoInitialize( NULL );

    IWinHttpRequest *  pIWinHttpRequest = NULL;

#includeIWinHttpRequest类型的正确方法感到困惑。我认为它来自httprequest.h不是系统包含文件的文件。

另外,我猜httprequest.h是编译的结果httprequest.idl。我应该手动编译httprequest.idl,还是因为这是 Windows SDK 的一部分,有没有更好的方法来访问这种类型?

标签: visual-c++visual-studio-2017com

解决方案


好吧,事先对此一无所知,我查看了您提供的接口,IWinHttpRequest。我去注册表,在 HKCR\Interface 中搜索,在注册表中找到了接口的 typelib。类型库是 HKEY_CLASSES_ROOT\TypeLib\{662901FC-6951-4854-9EB2-D9A2570F2B2E}。从 typelib 中查找 HKEY_CLASSES_ROOT\TypeLib\{662901FC-6951-4854-9EB2-D9A2570F2B2E}\5.1\0\win32。win32 条目显示类型库在磁盘上的位置:%SystemRoot%\system32\winhttpcom.dll

由于 %SystemRoot%\system32 直接始终位于路径中,因此您可以像这样简单地使用 typelib:

#import "winhttpcom.dll"

在幕后,Visual C++ 编译器将创建名为 winhttpcom.tlh 和 winhttpcom.tli 的文件。您可以忽略这些文件。编译器只是自动包含并链接这些文件。

它将在 .tlh 文件中声明 COM 智能指针:

_COM_SMARTPTR_TYPEDEF(IWinHttpRequest, __uuidof(IWinHttpRequest));
_COM_SMARTPTR_TYPEDEF(IWinHttpRequestEvents, __uuidof(IWinHttpRequestEvents));

所有这些都将包装在 C++ 命名空间中:

namespace WinHttp { 
// definitions in here
}

如果您不想要命名空间,您可以执行以下操作:

#import "winhttpcom.dll" no_namespace

#import 的文档位于https://docs.microsoft.com/en-us/cpp/preprocessor/hash-import-directive-cpp?view=vs-2019


推荐阅读