共用方式為


適用於 Windows 的 Rust 使用 VS Code 的 RSS 閱讀器教學

上一個主題介紹適用於 Windows 的 Rust ,以及 windows 套件

現在,讓我們通過撰寫一個簡單的控制台應用程式來試用 Rust for Windows,此應用程式將從簡單聚合(RSS)摘要下載部落格文章的標題。

  1. 啟動命令提示字元 (cmd.exe),並將 cd 至您要保留 Rust 項目的資料夾。

  2. 使用 Cargo,建立一個名為 rss_reader的新 Rust 專案,然後將 cd 至新建立的資料夾中:

    > cargo new rss_reader
    >     Created binary (application) `rss_reader` package
    > cd rss_reader
    
  3. 然後在 VS Code 中開啟 rss_reader 專案。

    code .
    
  4. 讓我們實作主要 rss_reader 專案。 首先,在專案的根目錄開啟 Cargo.toml 檔案。 檔案 Cargo.toml 是描述 Rust 專案的文字檔,包括它擁有的任何相依性。

    新增對 視窗 套件的相依性,如清單所示。 Windows 箱子很大。 為了縮短建置時間,我們將只選取此程式代碼所需的 Foundation_CollectionsWeb_Syndication 功能。

    # Cargo.toml
    ...
    
    [dependencies.windows] 
    version = "0.43.0"
    features = [
        "Foundation_Collections",
        "Web_Syndication",
    ]
    
  5. 然後,開啟 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 類型。

  6. 若要建立新的 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 來處理字串值。

  7. 若要下載 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 慣例,並將其建構函式命名 新的

  8. 現在,我們可以使用 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

  9. 現在我們可以逐一查看產生的項目,我們來列印標題吧。 您也會看到以下一些額外的程式碼行,用於設定用戶代理標頭,因為有些 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(())
    }
    
  10. 現在,讓我們確認我們可以藉由點擊 [執行>執行但不偵錯](或按 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) 的 來解析 檔案,並在運行時嚴格遵循 COM 應用程式二進位介面(ABI),兼顧安全性和效率。

顯示消息框

我們確實說 Rust for Windows 可讓您呼叫任何 Windows API(過去、目前和未來)。 因此,在本節中,我們將顯示幾個 Windows 消息框。

  1. 就像我們針對 RSS 專案所做的一樣,在命令提示字元中輸入 cd,然後進入存放 Rust 專案的資料夾。

  2. 建立名為 message_box 的新專案,並在 VS Code 中開啟它:

    > cargo new message_box
    >     Created binary (application) `message_box` package
    > cd message_box
    > code .
    
  3. 在 VS Code 中開啟Cargo.toml,並新增此專案的 Windows 相依性:

     # message_box\Cargo.toml
     ...
    
     [dependencies.windows]
     version = "0.43.0"
     features = [
         "Win32_Foundation",
         "Win32_UI_WindowsAndMessaging",
     ]
    
  4. 現在開啟項目的 src/main.rs 檔案,並使用新的命名空間新增 use 宣告(如下所示)。 最後新增程式代碼以呼叫 MessageBoxAMessageBoxW 函式。 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 字串常值生成 LPCSTRLPCWSTR 引數;類似於我們使用 h! 巨集為 rss_reader建立 HSTRING。 Rust 原生支援 Unicode 和 UTF-8 字串,因此在 Windows 上,建議優先使用帶有 W 後綴的 Unicode APIs,而非帶有 A 後綴的 ANSI APIs。 如果您在程序代碼中使用非英文文字,這很重要。

當您建置並執行時,Rust 會顯示兩個 Windows 消息框。