visual-c++ - 如何将 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;
我#include
对IWinHttpRequest
类型的正确方法感到困惑。我认为它来自httprequest.h
不是系统包含文件的文件。
另外,我猜httprequest.h
是编译的结果httprequest.idl
。我应该手动编译httprequest.idl
,还是因为这是 Windows SDK 的一部分,有没有更好的方法来访问这种类型?
解决方案
好吧,事先对此一无所知,我查看了您提供的接口,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
推荐阅读
- javascript - 在 Django 中添加弹出消息
- python - 为什么 MDCard 无法在 KivyMD 中添加 on_touch_down?
- angular - 如何使用 TS 进行 POST?
- ios - SwiftUI 中 @GestureState 的显式动画
- javascript - AWS DynamoDB:从 Promise 内部返回值
- c++ - 分离轴定理C ++的问题
- sql - 从结果表中选择几行并实现以下输出
- node.js - 如何在 mongodb/mongoose 的嵌套数组中检查是否存在并更新对象?
- node.js - 无法点击搜索按钮
- python - Python(Cartopy):如何解决“多边形对象错误”