键盘快捷键

在章节间导航

S/ 在书中搜索

? 显示此帮助

Esc 隐藏此帮助

调用您的第一个 WinRT API

Windows 8 引入了 Windows 运行时(Windows Runtime),它的核心就是 COM,只不过增加了一些约定,让语言绑定看起来更无缝。windows crate 已经让调用 COM API 比 C++ 开发者更无缝了,但 WinRT 更进一步,它为构造函数、事件和类层次结构等建模提供了头等支持。在调用您的第一个 COM API中,我们看到在调用 COM 接口方法之前,您仍然需要通过 C 风格的 DLL 导出引导 API。WinRT 的工作方式相同,但以一种通用的方式抽象了这一点。

让我们用一个简单的例子来说明。XmlDocument“类”对可以从各种来源加载的 XML 文档进行建模。Rust windows crate 的文档表明此类型位于 Data::Xml::Dom 模块中,因此我们可以如下配置 windows crate 依赖项

[dependencies.windows]
version = "0.52" 
features = [
    "Data_Xml_Dom",
]

我们可以使用 use 声明让这个 API 更容易访问。windows crate 的 core 模块只提供了一些助手,使使用 Windows API 变得更容易,所以我们也会包含它

#![allow(unused)]
fn main() {
use windows::{core::*, Data::Xml::Dom::XmlDocument}; 
}

对于这个例子,我将只使用一个简单的 main 函数,其中包含来自 windows::core 模块的 Result 类型,以提供自动错误传播并简化后续的 API 调用

fn main() -> Result<()> {

    Ok(())
}

与之前的 Win32 和 COM 示例不同,您会注意到这个 main 函数不需要 unsafe 块,因为 WinRT 调用由于其更受约束的类型系统而被认为是安全的。

首先,我们可以简单地调用 new 方法来创建一个新的 XmlDocument 对象

#![allow(unused)]
fn main() {
let doc = XmlDocument::new()?;
}

这看起来更像一个惯用的 Rust 类型,而不是典型的 COM API,但在底层,通过 DLL 导出实例化 XmlDocument 实现使用了类似的机制。然后我们可以调用 LoadXml 方法来测试它。还有各种其他选项可以从不同的源加载 XML,您可以在官方文档XmlDocument API 的 Rust 文档中阅读。windows crate 还提供了方便的 h! 宏来创建 HSTRING,这是 WinRT API 使用的字符串类型

#![allow(unused)]
fn main() {
doc.LoadXml(h!("<html>hello world</html>"))?;
}

就这样,我们有了一个完整的 Xml 文档,我们可以检查它。在这个例子中,让我们只获取文档元素,然后执行一些基本的查询,如下所示

#![allow(unused)]
fn main() {
let root = doc.DocumentElement()?;
assert!(root.NodeName()? == "html");
println!("{}", root.InnerText()?);
}

首先我们断言元素的名称实际上是“html”,然后打印出元素的内部文本。与之前的 COM 示例一样,这些方法都通过 COM 接口调用虚函数,但 windows crate 使直接从 Rust 进行此类调用变得非常简单。就是这样。运行示例应该打印出类似以下内容

hello world

这是完整的示例供参考