時(shí)下如果語(yǔ)言界要評(píng)選一個(gè)網(wǎng)紅的話(huà),無(wú)疑會(huì)是Rust。Rust憑借著自己出色的安全性和高效性被各大平臺(tái)所接納,Linux內(nèi)核,安卓底層開(kāi)發(fā),Windows底層開(kāi)發(fā)相繼都采納并給出了對(duì)應(yīng)的借口。微軟的Windows也是,最近發(fā)布了Rust for Windows(windows-rs) v 0.9。更新中包括全面的調(diào)用支持,Rust可以直接原生調(diào)用任何Windows API可以極大的拓展Rust在Windows下的開(kāi)發(fā)能力和范圍。本文我們通過(guò)實(shí)例來(lái)學(xué)習(xí)Rust for Windows 。
咸豐網(wǎng)站制作公司哪家好,找創(chuàng)新互聯(lián)!從網(wǎng)頁(yè)設(shè)計(jì)、網(wǎng)站建設(shè)、微信開(kāi)發(fā)、APP開(kāi)發(fā)、響應(yīng)式網(wǎng)站建設(shè)等網(wǎng)站項(xiàng)目制作,到程序開(kāi)發(fā),運(yùn)營(yíng)維護(hù)。創(chuàng)新互聯(lián)自2013年創(chuàng)立以來(lái)到現(xiàn)在10年的時(shí)間,我們擁有了豐富的建站經(jīng)驗(yàn)和運(yùn)維經(jīng)驗(yàn),來(lái)保證我們的工作的順利進(jìn)行。專(zhuān)注于網(wǎng)站建設(shè)就選創(chuàng)新互聯(lián)。
?
概述
本次更新提供了很多新的特性和更新,根據(jù)官方的信息包括:
添加了對(duì)Win32和COM API的支持,統(tǒng)一了Windows板條箱。這些Windows API有新的項(xiàng)目win32metadata來(lái)添加。為了方便和統(tǒng)一,項(xiàng)目名稱(chē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)編寫(xiě)。
Windows支持在Linux上構(gòu)建。
Win32 API的許多改進(jìn)和修復(fù),例如對(duì)數(shù)組類(lèi)型,各種字符串類(lèi)型和更新的元數(shù)據(jù)的支持。
添加了對(duì)COM接口的更自然和慣用的支持,例如返回值,以及對(duì)涉及C樣式聯(lián)合和嵌套類(lèi)型之類(lèi)的其他API的支持。
縮短了構(gòu)建時(shí)間并改善了錯(cuò)誤處理。
保留原始的API大小寫(xiě),這會(huì)影響使用Windows crate的現(xiàn)有代碼。通過(guò)類(lèi)似于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編譯還依賴(lài)Microsoft C++ build tools工具,不安裝,后面在編譯時(shí),會(huì)報(bào)錯(cuò)說(shuō)“l(fā)ink.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)
在用戶(hù)目錄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)建依賴(lài)的庫(kù)項(xiàng)目:
cargo new --lib bindings
然后通過(guò)
code .
在VS Code打開(kāi)該項(xiàng)目,截圖如下:
?
修改項(xiàng)目Cargo.toml文件中,添加以下依賴(lài)項(xiàng),依賴(lài)項(xiàng)告訴Cargo現(xiàn)在它依賴(lài)于新創(chuàng)建的win庫(kù)。
[dependencies]
bindings = {path = " bindings"}
現(xiàn)在,在win文件夾下的Cargo.toml文件中,添加對(duì)Windows板條箱的依賴(lài)項(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 宏指定要使用的類(lèi)型,可以再次列出需要使用的所API,Windows板條箱將直接元數(shù)據(jù)生成必要的綁定。
然后修改win/src目錄中為以下代碼:
windows::include_bindings!();
這樣,就可以在主項(xiàng)目main.rs文件中,任意調(diào)用指定的Windows API。此處我們創(chuàng)建一個(gè)“Hello Chongchong!”消息對(duì)話(huà)框。
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ì)話(huà)框。
?
新版本的板條箱中再帶了幾個(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)定性等各方面都有極大的改善。
理解Window系統(tǒng)、主窗口、窗口函數(shù)這三者之間的關(guān)系,對(duì)于編寫(xiě)Windows程序十分重要。
主函數(shù)和窗口函數(shù)都是由Windows系統(tǒng)來(lái)調(diào)用的函數(shù),只不過(guò)主函數(shù)是程序啟動(dòng)之后,系統(tǒng)首先調(diào)用的函數(shù);
而窗口函數(shù)是主函數(shù)在獲得消息并把消息發(fā)給系統(tǒng)之后,由操作系統(tǒng)調(diào)用的函數(shù)。
不同的消息所對(duì)應(yīng)的操作就是由窗口函數(shù)完成的,Windows程序員的工作就是編寫(xiě)窗口函數(shù)的case中的代碼。
Windows系統(tǒng)、主函數(shù)、窗口函數(shù)這三者之間的關(guān)系,如下圖所示:
windows操作系統(tǒng)下system () 函數(shù)詳解(主要是在C語(yǔ)言中的應(yīng)用) 函數(shù)名: system
功 能: 發(fā)出一個(gè)DOS命令
用 法: int system(char *command);
system函數(shù)需加頭文件stdlib.h后方可調(diào)用
程序例: #include?stdlib.h#include?stdio.hint?main(void){printf(About?to?spawn?and?run?a?DOS?command\n);system(dir);return?0;}又如:system(pause)可以實(shí)現(xiàn)凍結(jié)屏幕,便于觀(guān)察程序的執(zhí)行結(jié)果;system(CLS)可以實(shí)現(xiàn)清屏操作。而調(diào)用color函數(shù)可以改變控制臺(tái)的前景色和背景,具體參數(shù)在下面說(shuō)明。
例如,用 system(color 0A); 其中color后面的0是背景色代號(hào),A是前景色代號(hào)。各顏色代碼如下:
0=黑色 1=藍(lán)色 2=綠色 3=湖藍(lán)色 4=紅色 5=紫色 6=黃色 7=白色 8=灰色 9=淡藍(lán)色 A=淡綠色 B=淡淺綠色 C=淡紅色 D=淡紫色 E=淡黃色 F=亮白色
(注意:Microsoft Visual C++6.0 支持system)
舉例
看了下面實(shí)例,相信你會(huì)對(duì)學(xué)到更多system在C程序設(shè)計(jì)中的應(yīng)用。
例一:
C語(yǔ)言調(diào)用DOS命令實(shí)現(xiàn)定時(shí)關(guān)機(jī): #includestdio.h#includestring.h#includestdlib.hint?print(){printf(?╪╪╪╪╪╪╧╧╧╧╧╧╧╧╪╪╪╪╪╪\n);printf(╔═══╧╧C語(yǔ)言關(guān)機(jī)程序?╧╧═══╗\n);printf(║※1.實(shí)現(xiàn)10分鐘內(nèi)的定時(shí)關(guān)閉計(jì)算機(jī)?║\n);printf(║※2.立即關(guān)閉計(jì)算機(jī) ?║\n);printf(║※3.注銷(xiāo)計(jì)算機(jī) ?║\n);printf(║※0.退出系統(tǒng) ?║\n);printf(╚═══════════════════╝\n);return?0;}void?main(){system(title?C語(yǔ)言關(guān)機(jī)程序);//設(shè)置cmd窗口標(biāo)題system(mode?con?cols=48?lines=25);//窗口寬度高度system(color?0B);system(date?/T);system(TIME?/T);char?cmd[20]=shutdown?-s?-t?;char?t[5]=0;print();int?c;scanf(%d,c);getchar();switch(c){case?1:printf(您想在多少秒后自動(dòng)關(guān)閉計(jì)算機(jī)?(0~600)\n);scanf(%s,t);system(strcat(cmd,t));break;case?2:system(shutdown?-p);break;case?3:system(shutdown?-l);break;case?0:break;default:printf(Error!\n);}system(pause);exit(0);}例二:
用C語(yǔ)言刪除文件,例如文件的位置是d:\123.txt
用system()函數(shù)執(zhí)行windows命令。 #include?stdlib.h#include?stdio.hint?main(void){system(del?d:\\123.txt);return?0;}
API全稱(chēng)是Application Programming Interface,可以稱(chēng)為“應(yīng)用程序編程接口”??捎刹僮飨到y(tǒng)或其他應(yīng)用程序調(diào)用。它是操作系統(tǒng)自帶的一套強(qiáng)大的函數(shù)集,直接面對(duì)操作系統(tǒng)的底層,可以完成一些VB不能實(shí)現(xiàn)的功能,執(zhí)行效率要比VB自帶的函數(shù)高。
聲明API函數(shù)的語(yǔ)句格式如下:
[public/private]Declare Function API 函數(shù)名 Lib "該函數(shù)所在的文件名"[Alias "該函數(shù)的別名"][(變量名及變量類(lèi)型說(shuō)明)] as API 函數(shù)類(lèi)型說(shuō)明。