如何将 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's developer command prompt
- 输入“
midl httprequest.idl /out [your project path]
”
这是示例输出:
**********************************************************************
** 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.h
、httprequest.tlb
和 httprequest_i.c
。
现在您应该可以编译示例代码了。请注意,如果您包含 httprequest_i.c
文件,您甚至可以在示例中删除 IID_IWinHttpRequest
的手动声明。
我一直在查看 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's developer command prompt
- 输入“
midl httprequest.idl /out [your project path]
”
这是示例输出:
**********************************************************************
** 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.h
、httprequest.tlb
和 httprequest_i.c
。
现在您应该可以编译示例代码了。请注意,如果您包含 httprequest_i.c
文件,您甚至可以在示例中删除 IID_IWinHttpRequest
的手动声明。