【问题标题】:How to find a CLSID in rust for windows?如何在 Windows 的 rust 中找到 CLSID?
【发布时间】:2022-08-03 19:11:11
【问题描述】:

我正在使用 rust for windows 来使用 win32 API。
但是,我需要初始化 com 库以使用一些 Windows API,但我找不到一些类 ID (CLSID) 来创建实例。
我需要找到用于创建实例的 Speech ISpVoice CLSID。
CLSID_SpVoice 是 CLSID。
另外,我找不到一些宏,例如“FAILED”和“SUCCEEDED”。
如果有人可以指导我,将不胜感激!
另外,如果我的代码中有任何错误,请突出显示我。
代码:

    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)
        }
    }
}

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

标签: winapi rust com clsid windows-rs


【解决方案1】:

windows crate 声明了 SpVoice 常量,它是 CLSID_SpVoice 类 ID 的值。正如您所发现的,这就是您想要传递给CoCreateInstanceCLSID

后者返回一个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(())
}

如果您需要 CLSID 无法通过 windows 板条箱获得,您始终可以使用 from_valuesfrom_u128 构造 GUID 常量:

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

请注意,该值为确切地您在comment 中获得的值。你认为 C++ 和 Rust 在 COM 方面有任何不同的评估是没有根据的。它们确实是同一件事,只是语法不同。

【讨论】:

    【解决方案2】:

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

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

    此方法适用于任何 CoCreateInstance。
    但是,我仍然坚持使用两个宏:“FAILED”和“SUCCEEDED”。
    如果有人知道,也请告诉我。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-01-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-31
      相关资源
      最近更新 更多