上一個主題介紹適用於 Windows 的 Rust ,以及 windows 套件。
現在,讓我們通過撰寫一個簡單的控制台應用程式來試用 Rust for Windows,此應用程式將從簡單聚合(RSS)摘要下載部落格文章的標題。
啟動命令提示字元 (
cmd.exe
),並將cd
至您要保留 Rust 項目的資料夾。使用 Cargo,建立一個名為 rss_reader的新 Rust 專案,然後將
cd
至新建立的資料夾中:> cargo new rss_reader > Created binary (application) `rss_reader` package > cd rss_reader
然後在 VS Code 中開啟 rss_reader 專案。
code .
讓我們實作主要 rss_reader 專案。 首先,在專案的根目錄開啟
Cargo.toml
檔案。 檔案Cargo.toml
是描述 Rust 專案的文字檔,包括它擁有的任何相依性。新增對 視窗 套件的相依性,如清單所示。 Windows 箱子很大。 為了縮短建置時間,我們將只選取此程式代碼所需的
Foundation_Collections
和Web_Syndication
功能。# Cargo.toml ... [dependencies.windows] version = "0.43.0" features = [ "Foundation_Collections", "Web_Syndication", ]
然後,開啟 rss_reader 專案的
src/main.rs
原始碼檔案。 您可以在該處找到 Cargo 預設的 “Hello, world!” 程式代碼。 將下列 使用 語句新增至main.rs
開頭:// src\main.rs use windows::{ core::*, Foundation::Uri, Web::Syndication::SyndicationClient }; fn main() { println!("Hello, world!"); }
使用 宣告會縮短我們將使用的類型路徑。 我們稍早提到的 Uri 類型。
若要建立新的 Uri,請將 Cargo 的預設 main 函式替換為以下內容:
// src\main.rs ... fn main() -> Result<()> { let uri = Uri::CreateUri(h!("https://blogs.windows.com/feed"))?; Ok(()) }
請注意,main 函式的傳回型別是 Result,來自 windows::core::。 這會使事情變得更容易,因為處理來自作業系統(OS) API 的這些錯誤是很常見的。 windows::core::Result 幫助我們進行錯誤傳遞和簡化錯誤處理。
您可以在程式代碼行結尾看到問號運算子。 為了減少打字,我們使用 Rust 的錯誤傳播和短路邏輯來達到這一目的。 這表示我們不需要針對這個簡單的範例執行一堆手動錯誤處理。 如需 Rust 此功能的詳細資訊,請參閱 ? 運算子,以方便錯誤處理。
另請注意來自 windows crate 的 h! 巨集。 我們會使用該方法來從 Rust 字串常值建構 HSTRING 參考。 WinRT API 廣泛使用 HSTRING 來處理字串值。
若要下載 RSS 摘要,我們將建立新的 SyndicationClient。
// src\main.rs ... fn main() -> windows::core::Result<()> { let uri = Uri::CreateUri(h!("https://blogs.windows.com/feed"))?; let client = SyndicationClient::new()?; Ok(()) }
新的函式是 Rust 建構函式。 視窗中的所有物件 都遵循 Rust 慣例,並將其建構函式命名 新的。
現在,我們可以使用 SyndicationClient 來擷取資訊流。
// src\main.rs ... fn main() -> windows::core::Result<()> { let uri = Uri::CreateUri(h!("https://blogs.windows.com/feed"))?; let client = SyndicationClient::new()?; let feed = client.RetrieveFeedAsync(&uri)?.get()?; Ok(()) }
因為 RetrieveFeedAsync 是異步 API,所以我們使用封鎖 get 函式來保持範例簡單。 或者,我們可以在
await
函式中使用async
運算符,以協作地等待結果。 具有圖形使用者介面的較複雜應用程式通常會使用async
。現在我們可以逐一查看產生的項目,我們來列印標題吧。 您也會看到以下一些額外的程式碼行,用於設定用戶代理標頭,因為有些 RSS 摘要需要這樣做。
// src\main.rs ... fn main() -> windows::core::Result<()> { let uri = Uri::CreateUri(h!("https://blogs.windows.com/feed"))?; let client = SyndicationClient::new()?; client.SetRequestHeader( h!("User-Agent"), h!("Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; WOW64; Trident/6.0)"), )?; let feed = client.RetrieveFeedAsync(&uri)?.get()?; for item in feed.Items()? { println!("{}", item.Title()?.Text()?); } Ok(()) }
現在,讓我們確認我們可以藉由點擊 [執行>執行但不偵錯](或按 Ctrl+F5)來進行建置並執行。 如果您看到任何未預期的訊息,請確定您已成功完成 Hello, world! 教學課程 (Rust with VS Code)。
也有 偵錯 和 執行 命令內嵌於文本編輯器中。 或者,從資料夾中的
rss_reader
命令提示字元輸入cargo run
,這會建置並執行程式。在 VS Code 終端機 視窗中,您可以看到 Cargo 已成功下載並編譯 windows crate,並快取這些編譯結果,從而在後續組建中縮短完成所需的時間。 然後,它會建置範例並加以執行,並顯示部落格文章標題的清單。
要在 Windows 上使用 Rust 進行程式設計,就是這麼簡單。 不過,在幕後,許多愛都投入到建置工具中,以便 Rust 能夠根據 ECMA-335 (Common Language Infrastructure 或 CLI) 的
顯示消息框
我們確實說 Rust for Windows 可讓您呼叫任何 Windows API(過去、目前和未來)。 因此,在本節中,我們將顯示幾個 Windows 消息框。
就像我們針對 RSS 專案所做的一樣,在命令提示字元中輸入
cd
,然後進入存放 Rust 專案的資料夾。建立名為 message_box 的新專案,並在 VS Code 中開啟它:
> cargo new message_box > Created binary (application) `message_box` package > cd message_box > code .
在 VS Code 中開啟
Cargo.toml
,並新增此專案的 Windows 相依性:# message_box\Cargo.toml ... [dependencies.windows] version = "0.43.0" features = [ "Win32_Foundation", "Win32_UI_WindowsAndMessaging", ]
現在開啟項目的
src/main.rs
檔案,並使用新的命名空間新增use
宣告(如下所示)。 最後新增程式代碼以呼叫 MessageBoxA 和 MessageBoxW 函式。 Windows API 檔主要以 C/C++撰寫,因此比較 API 檔與 視窗 箱中的 Rust 投影檔很有用:MessageBoxA (Rust) 和 MessageBoxW (Rust)。// src\main.rs use windows::{ core::*, Win32::UI::WindowsAndMessaging::* }; fn main() { unsafe { MessageBoxA(None, s!("Ansi"), s!("World"), MB_OK); MessageBoxW(None, w!("Wide"), w!("World"), MB_OK); } }
如您所見,我們必須在區塊中使用
unsafe
這些 Win32 API(請參閱 Unsafe 區塊)。 另請注意 s! 和 w! 巨集,這些巨集會從 Rust UTF-8 字串常值生成 LPCSTR 和 LPCWSTR 引數;類似於我們使用 h! 巨集為 rss_reader建立 HSTRING。 Rust 原生支援 Unicode 和 UTF-8 字串,因此在 Windows 上,建議優先使用帶有 W 後綴的 Unicode APIs,而非帶有 A 後綴的 ANSI APIs。 如果您在程序代碼中使用非英文文字,這很重要。
當您建置並執行時,Rust 會顯示兩個 Windows 消息框。
相關項目
- 適用於 Windows 的 Rust,以及 windows 套件
- ECMA-335
- 這? 運算符,能讓您更容易處理錯誤
- 不安全區塊