次の方法で共有


RSS リーダー チュートリアル (VS Code を使用した Windows 用 Rust)

前のトピックでは 、Rust for Windows と Windows クレートについて説明しました。

次に、Really Simple Syndication (RSS) フィードからブログ投稿のタイトルをダウンロードする簡単なコンソール アプリを作成して、Windows 用 Rust を試してみましょう。

  1. コマンド プロンプト (cmd.exe) を起動し、Rust プロジェクトを保持するフォルダーに cd します。

  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 プロジェクトを記述するテキスト ファイルです。これには、依存関係も含まれます。

    次の一覧に示すように、 ウィンドウ クレートに依存関係を追加します。 ウィンドウ用の クレートは大きい。 ビルド時間を短縮するために、このコードに必要な Foundation_Collections 機能と Web_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 関数の戻り値の型は、windows::core::からの Resultであることに注意してください。 オペレーティング システム (OS) API からのエラーに対処するのが一般的であるため、処理が容易になります。 windows::core::Result は、エラー伝達と簡潔なエラー処理に役立ちます。

    コード行の末尾に疑問符演算子が表示されます。 入力を節約するために、Rust のエラー伝達と短絡ロジックを使用します。 つまり、この簡単な例では、一連の手動エラー処理を行う必要はありません。 Rust のこの機能の詳細については、を参照してください。のエラー処理を容易にする演算子です。

    また、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 の規約に従って、コンストラクターをnewと名付けています。

  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! チュートリアル (VS Code を使用した Rust) が正常に完了していることを確認してください。

    また、テキストエディター内には、デバッグ コマンドと 実行 コマンドも埋め込まれています。 または、 rss_reader フォルダーのコマンド プロンプトから「 cargo run」と入力します。これにより、プログラムがビルドされて実行されます。

    テキスト エディターに埋め込まれたデバッグコマンドと実行コマンド

    VS Code ターミナル ペインで、Cargo が ウィンドウをクレート 正常にダウンロードしてコンパイルし、結果をキャッシュし、それらを使用して後続のビルドを短時間で完了していることがわかります。 次に、サンプルをビルドして実行し、ブログ投稿タイトルの一覧を表示します。

    ブログ投稿タイトルの一覧

これは、Windows 用の Rust をプログラムするのと同じくらい簡単です。 内部では、Rust が ECMA-335 (共通言語インフラストラクチャ、または CLI) に基づいて ファイルを解析し、安全性と効率性を重視して、実行時に COM ベースのアプリケーションバイナリインタフェース (ABI) を忠実に遵守できるようにするために、ツールの開発に多大な努力が注がれています。

メッセージ ボックスの表示

Rust for Windows では、任意の Windows API (過去、現在、将来) を呼び出すことができます。 このセクションでは、いくつかの Windows メッセージ ボックスを示します。

  1. RSS プロジェクトの場合と同様に、コマンド プロンプトで Rust プロジェクトを含むフォルダーに cd します。

  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 宣言を追加します (次に示すように)。 最後に、 MessageBoxA 関数と MessageBoxW 関数を呼び出すコード を追加します 。 Windows API ドキュメントは主に C/C++ を念頭に置いて記述されているため、 WINDOWS クレートの Rust プロジェクション ( MessageBoxA (Rust)MessageBoxW (Rust) のドキュメントと API ドキュメントを比較すると便利です。

    // 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);
        }
    }
    

    ご覧のように、これらの Win32 API は unsafe ブロックで使用する必要があります ( 安全でないブロックを参照)。 また、s!w! のマクロにも注目してください。これらのマクロは、RustのUTF-8文字列リテラルからLPCSTRおよびLPCWSTR引数を生成します。まるでh!マクロを用いてHSTRINGrss_readerで生成したのと同様に。 Rust は UTF-8 文字列を使用したネイティブ Unicode であるため、ANSI (A サフィックス) API よりもワイド Unicode (W サフィックス) Windows API を使用することをお勧めします。 これは、コードで英語以外のテキストを使用する場合に重要な場合があります。

今回ビルドして実行すると、Rust に 2 つの Windows メッセージ ボックスが表示されます。