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