如何在rust for windows中找到CLSID



我使用rust for windows来使用win32 API
但是,我需要初始化com库来使用一些windows API,但我找不到一些类ID(CLSID(来创建实例
我需要找到Speech ISpVoice CLSID,以便在创建实例时使用
CLSID_SpVoice是CLSID
此外,我找不到一些宏,如"失败";,以及";成功">
如果有人能指导我,我将不胜感激
此外,如果我的代码中有任何错误,请突出显示。
代码:

use windows::Win32::System::Com::{CoInitializeEx, CoCreateInstance};
use windows::Win32::System::{Com, Ole};
use windows::core::{ HRESULT, Error };
use windows::Win32::Media::Speech::ISpVoice;
fn main() {
let speaker: ISpVoice;
unsafe {
if CoInitializeEx(std::ptr::null(), Com::COINIT_MULTITHREADED) ==Result::Ok(()) {
let hr: HRESULT = CoCreateInstance(, punkouter, dwclscontext)
}
}
}

如果有什么不清楚的地方,请告诉我

windows机箱声明SpVoice常量,该常量是CLSID_SpVoice类ID的值。正如您所发现的,这是您想要传递到CoCreateInstance中的CLSID

后者返回一个windows::core::Result<T>,它对使用SUCCEEDEDFAILED宏的C代码的语义进行建模。您可以手动在OkErr变体上使用match,也可以使用?运算符来方便地传播错误:

use std::ptr;
use windows::{
core::Result,
Win32::{
Media::Speech::{ISpVoice, SpVoice},
System::Com::{CoCreateInstance, CoInitializeEx, CLSCTX_ALL, COINIT_APARTMENTTHREADED},
},
};
fn main() -> Result<()> {
unsafe { CoInitializeEx(ptr::null(), COINIT_APARTMENTTHREADED) }?;
let _speaker: ISpVoice = unsafe { CoCreateInstance(&SpVoice, None, CLSCTX_ALL) }?;
Ok(())
}

如果您需要通过windows机箱不可用的CLSID,您可以始终使用from_valuesfrom_u128:构造GUID常量

const CLSID_SpVoice: GUID = GUID::from_u128(0x96749377_3391_11d2_9ee3_00c04f797396);

请注意,该值是,正是注释中给出的值。你认为C++和Rust在COM方面有任何不同是没有根据的。它们确实是一样的东西,只是语法不同而已。

我找到了解决方案
我会告诉任何可能遇到此问题的人我的答案:
我没有提供ISpVoice的Class ID,而是将SpVoice结构引用到CoCreateInstance方法,然后它返回SpVoice构造
如下:

let speaker: ISpVoice = CoCreateInstance(&SpVoice, None, CLSCTX_ALL)?;

此方法将适用于任何CoCreateInstance
然而,我仍然使用两个宏:"失败";,以及";成功">
如果有人知道,也请告诉我。

最新更新