如何将 IWinHttpRequest 导入 MSVC++ 项目?

How to import IWinHttpRequest into MSVC++ Project?

我一直在查看 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;

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

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

嗯,事先对此一无所知,我查了一下你给的接口,IWinHttpRequest。我去了注册表并在 HKCR\Interface 中搜索它,在注册表中找到了接口的类型库。类型库是 HKEY_CLASSES_ROOT\TypeLib\{662901FC-6951-4854-9EB2-D9A2570F2B2E}。从类型库中,查找 HKEY_CLASSES_ROOT\TypeLib\{662901FC-6951-4854-9EB2-D9A2570F2B2E}\5.1[=32=]\win32。 win32 条目显示类型库在磁盘上的位置:%SystemRoot%\system32\winhttpcom.dll

由于 %SystemRoot%\system32 直接在路径中,您可以像这样简单地使用类型库:

#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

只是缺少有关如何获取 httprequest.h 文件的说明。 Windows SDK 只有.idl 文件。这有点不寻常,许多 Windows API 有 .idl 和 .h,有些只有 .h,有些只有 .idl ...但是你可以从 .idl 创建 .h:

这是示例输出:

**********************************************************************
** Visual Studio 2019 Developer Command Prompt v16.5.1
** Copyright (c) 2019 Microsoft Corporation
**********************************************************************

C:\Program Files (x86)\Microsoft Visual Studio19\Professional>midl httprequest.idl /out D:\MyPath\MyAppDir
Microsoft (R) 32b/64b MIDL Compiler Version 8.01.0622
Copyright (c) Microsoft Corporation. All rights reserved.
Processing C:\Program Files (x86)\Windows Kits\include.0.18362.0\um\httprequest.idl
httprequest.idl
Processing C:\Program Files (x86)\Windows Kits\include.0.18362.0\um\oaidl.idl
oaidl.idl
Processing C:\Program Files (x86)\Windows Kits\include.0.18362.0\um\objidl.idl
objidl.idl
Processing C:\Program Files (x86)\Windows Kits\include.0.18362.0\um\unknwn.idl
unknwn.idl
Processing C:\Program Files (x86)\Windows Kits\include.0.18362.0\shared\wtypes.idl
wtypes.idl
Processing C:\Program Files (x86)\Windows Kits\include.0.18362.0\shared\wtypesbase.idl
wtypesbase.idl
Processing C:\Program Files (x86)\Windows Kits\include.0.18362.0\shared\basetsd.h
basetsd.h
Processing C:\Program Files (x86)\Windows Kits\include.0.18362.0\shared\guiddef.h
guiddef.h
Processing C:\Program Files (x86)\Windows Kits\include.0.18362.0\um\oaidl.acf
oaidl.acf

它将在您的项目目录中创建 3 个文件:httprequest.hhttprequest.tlbhttprequest_i.c

现在您应该可以编译示例代码了。请注意,如果您包含 httprequest_i.c 文件,您甚至可以在示例中删除 IID_IWinHttpRequest 的手动声明。