Библиотека оформлена в виде Rust crate под MIT License, который можно использовать вот так:
[dependencies]
windows = "0.2.1"
[build-dependencies]
windows = "0.2.1"
После этого в скрипте сборки build.rs
можно сгенерировать те модули, которые нужны для вашего приложения:
fn main() {
windows::build!(
windows::data::xml::dom::*
windows::win32::system_services::{CreateEventW, SetEvent, WaitForSingleObject}
windows::win32::windows_programming::CloseHandle
);
}
Документация о доступных модулях опубликована на docs.rs.
Пример кода:
mod bindings {
::windows::include_bindings!();
}
use bindings::{
windows::data::xml::dom::*,
windows::win32::system_services::{CreateEventW, SetEvent, WaitForSingleObject},
windows::win32::windows_programming::CloseHandle,
};
fn main() -> windows::Result<()> {
let doc = XmlDocument::new()?;
doc.load_xml("<html>hello world</html>")?;
let root = doc.document_element()?;
assert!(root.node_name()? == "html");
assert!(root.inner_text()? == "hello world");
unsafe {
let event = CreateEventW(
std::ptr::null_mut(),
true.into(),
false.into(),
std::ptr::null(),
);
SetEvent(event).ok()?;
WaitForSingleObject(event, 0);
CloseHandle(event).ok()?;
}
Ok(())
}
Для некоторых вызовов функций используется unsafe
, так как эти функции предоставляются как они есть, не адаптируя их к конвенциями Rust. По такому же принципу устроен crate libc
, который служит базовым crate для доступа к libc и используется как основа для пострения библиотек с безопасным интерфейсом.
Проект создан в рамках Win32 Metadata Project, который призван облегчить создание API для разных языков программирования. Вторая библиотека, которая была создана на основе Metadata Project на первое фазе проекта - C#/Win32. Также Microsoft анонсировала начало работы над версией для С++, которая использует современный стиль языка.
>>> Github