我正在尝试将这个使用 winapi 调用 WMI/COM 的示例从 C++ 转换为 Rust,但在原始代码中有一些我不明白的地方。这是 C++ 代码中的函数调用:
hres = CoCreateInstance(
CLSID_WbemLocator,
0,
CLSCTX_INPROC_SERVER,
IID_IWbemLocator, (LPVOID *) &pLoc);
Run Code Online (Sandbox Code Playgroud)
令我困惑的是第一个和第四个参数的类型。以第四个参数为例。如果我们查看CoCreateInstance 的定义,第四个参数的类型REFIID又被定义为 a *IID,其中 anIID 被定义为 a GUID。所以第四个参数应该是一个指向GUID对象的指针。
但是,如果你看一下我的想法是定义的IID_IWbemLocator,它被定义为一个GUID(使用DEFINE_GUID宏)。所以看起来我们将 aGUID作为参数传递,而实际上我们应该传递一个指向 a 的指针GUID。为什么这段代码会编译?
相比之下,在 Rust 中,我必须传递对IID_IWbemLocator.
抱歉,如果答案真的很简单,我对 C++ 和 Winapi 都不太熟悉。
第三个参数是 REFIID 类型,它又被定义为 *IID,其中 IID 被定义为 GUID。所以第三个参数应该是一个指向 GUID 对象的指针。
您链接的文档不正确。我怀疑它是为 C 编写的。
在 C++ 中,REFIID 和 REFCLSID 被定义为 Windows 头文件中的 IID 引用,如下所示:
#ifdef __cplusplus
#define REFIID const IID &
#else
#define REFIID const IID * __MIDL_CONST
#endif
#ifdef __cplusplus
#define REFCLSID const IID &
#else
#define REFCLSID const IID * __MIDL_CONST
#endif
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
162 次 |
| 最近记录: |