【发布时间】:2021-03-31 03:05:41
【问题描述】:
我希望能够在 Rust 中调用 SWbemServices 的 ExecQueryAsync,就像在 C++ 中的这个示例一样: https://docs.microsoft.com/fr-fr/windows/win32/wmisdk/example--getting-wmi-data-from-the-local-computer-asynchronously
我的问题是它需要 IWbemObjectSink 的实现,而 winapi 中没有。 winapi crates 提供an interface definition in Rust,但我应该如何在 Rust 中“实现”它? 我可以编写一个尊重接口的结构,我可以从 winapi crate 导入接口,但是我怎样才能将两者粘合在一起?
我还用 com-rs crate 做了一些实验,因为它提供了an example to implement an interface with the com::class! macro 但我能做的是创建另一个IWbemObjectSink接口并实现它,而不是从winapi::um::wbemcli:IWbemObjectSink开始并实现它......
感谢您的见解
【问题讨论】:
-
“但我能做的是创建另一个 IWbemObjectSink 接口并实现它” - 这正是你想要的。这是您提供自定义回调实现的机会,然后您将其传递给
ExecQueryAsync。后者会针对它收到的每个结果调用您的Indicate实现。您链接到的 C++ 示例代码正是这样做的(请参阅 QuerySink.h 和 QuerySink.cpp 文件)。所以这就是你的解决方案,除非我误解了这个问题。 -
您好@IInspectable 感谢您的回答,在我的上下文中,我“不能”创建一个新接口,即使它与
winapi::um::wbemcli:IWbemObjectSink完全相同,因为 Rust 编译器不会请允许我将我的接口提供给ExecQueryAsync,而不是winapi::um::wbemcli:IWbemObjectSink。 winapi crate 的维护者建议我查看com-implcrate 而不是更新的comcrate,因为最后一个与 winapi 不兼容。只要我有一个工作示例,我就会将它发布在这里(目前,它可以编译,这是一个很好的第一步!)
标签: winapi rust interface com wmi