Microsoft випустила офіційну Rust бібліотеку для Windows API

Бібліотека оформлена у вигляді 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(" hello world ")?;

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()?;
}

В порядку(())
}

Для деяких викликів функцій використовується unsafe, оскільки ці функції надаються як вони є, не адаптуючи їх до конвенцій Rust. За таким же принципом влаштований crate Libcщо служить базовим crate для доступу до libc і використовується як основа для побудови бібліотек з безпечним інтерфейсом.


Проект створений у рамках Win32 Metadata Project, що полегшує створення API для різних мов програмування. Друга бібліотека, яка була створена на основі Metadata Project на першій фазі проекту. C#/Win32. Також Microsoft анонсувала початок роботи над версією для С++яка використовує сучасний стиль мови.

Джерело: linux.org.ru