Window-rs——用 Rust 編寫 windows 原生程序
時下如果語言界要評選一個網紅的話,無疑會是 Rust。Rust 憑藉着自己出色的安全性和高效性被各大平臺所接納,Linux 內核,安卓底層開發,Windows 底層開發相繼都採納並給出了對應的藉口。微軟的 Windows 也是,最近發佈了 Rust for Windows v0.9。更新中包括全面的調用支持,Rust 可以直接原生調用任何 Windows API 可以極大的拓展 Rust 在 Windows 下的開發能力和範圍。本文我們通過實例來學習 Rust for Windows 。
概述
本次更新提供了很多新的特性和更新,根據官方的信息包括:
添加了對 Win32 和 COM API 的支持,統一了 Windows 板條箱。這些 Windows API 有新的項目 win32metadata 來添加。爲了方便和統一,項目名稱由 “Rust/WinRT” 更改爲“Rust for Windows”。
添加了幾個示例 ,演示瞭如何調用各種 Windows API(包括 Win32,COM 和 WinRT API)。
Windows 板條箱在 crates.io 發佈,現在支持 MIT 或 Apache 雙開源版權。
內置生成的 binding,無需再手動編寫。
Windows 支持在 Linux 上構建。
Win32 API 的許多改進和修復,例如對數組類型,各種字符串類型和更新的元數據的支持。
添加了對 COM 接口的更自然和慣用的支持,例如返回值,以及對涉及 C 樣式聯合和嵌套類型之類的其他 API 的支持。
縮短了構建時間並改善了錯誤處理。
保留原始的 API 大小寫,這會影響使用 Windows crate 的現有代碼。通過類似於 QueryInterface 的函數轉換爲通用函數,從而可以更安全,更方便地調用許多與 COM 相關的函數。
開發環境
Window 板條箱使用需要首先要在 Windows 下配置 Rust 開發環境,還在 Rust 環境的安裝也非常簡單傻瓜化。
安裝 rustup
首先從 Rust 官方 (rust-lang.org) 下載安裝包 rustup-init.exe(記得下載當前 Windows 對應的 32 位或者 64 位版本)。
然後直接執行安裝包,安裝程序爲自動配置好系統路徑,以後就可以直接在命令行下使用了,比如 cargo 包管理器。
安裝 C++ build tools
Windows 下的 rust 編譯還依賴 Microsoft C++ build tools 工具,不安裝,後面在編譯時,會報錯說 “link.exe” 無法找到。
需要從微軟 VS 下載出下載 vs_buildtools,選中 C++ 工具和 Windows SDK 組件並安裝。
安裝 VS Code 及其 Rust 插件
另外,爲了方便一般建議安裝 VS Code 及其 Rust 插件:
crates-io 國內源
配置 Rust 板條箱的國內源,由於官方 crates-io 國內下載太慢,甚至容易失敗,所以先配置國內源(比如 ustc)
在用戶目錄 C:\Users\CC.cargo 創建一個 config 文件,內容配置爲:
示例
首先,通過 cargo 創建一個新的 Rust 項目:
cargo new hello-chongchong
以上命令這將創建一個新目錄並 hello-chongchong 創建基本項目框架目錄和文件。
進入該目錄,並使用 --lib 命令嵌套創建依賴的庫項目:
cargo new --lib bindings
然後通過
code .
在 VS Code 打開該項目,截圖如下:
修改項目 Cargo.toml 文件中,添加以下依賴項,依賴項告訴 Cargo 現在它依賴於新創建的 win 庫。
[dependencies]
bindings = {path = " bindings"}
現在,在 win 文件夾下的 Cargo.toml 文件中,添加對 Windows 板條箱的依賴項,版本指定爲最新的 0.9.1。這樣就可以通過允許 Cargo 打包下載,構建和緩存 Windows 支持。
[dependencies]
windows = "0.9.1"
[build-dependencies]
windows = "0.9.1"
然後在 bindings 目錄下創建一個新的源文件 build.rs,並輸入一下源碼:
// build.rs
fn main() {
windows::build!(
Windows::Win32::WindowsAndMessaging::MessageBoxA
);
}
在代碼中,使用 windows::build 宏指定要使用的類型,可以再次列出需要使用的所 API,Windows 板條箱將直接元數據生成必要的綁定。
然後修改 win/src 目錄中爲以下代碼:
windows::include_bindings!();
這樣,就可以在主項目 main.rs 文件中,任意調用指定的 Windows API。此處我們創建一個 “Hello Chongchong!” 消息對話框。
use bindings::Windows::Win32::WindowsAndMessaging::{MessageBoxA, MESSAGEBOX_STYLE};
fn main() {
unsafe {
MessageBoxA(None, "Hello Chongchong!", "Message", MESSAGEBOX_STYLE::MB_OK);
}
}
注意,任何 Win32 函數和 COM 接口方法,都需要用 unsafe 方式調用。
然後通過 cargo build 編譯該項目,並通過 cargo run 會彈出一下對話框。
新版本的板條箱中再帶了幾個例子,可以在 windows-rs 項目倉庫的 examples 目錄。
總結
Rust for Windows 給 rust 在 Windows 開發應用帶來了福音,雖然一些 API 可能早就被廣泛地使用了,但是現在有了官方的支持,可以在文檔、示例和穩定性等各方面都有極大的改善。
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/xGqKKT78wIk9KoqaVZz5QQ