前のトピックでは 、Rust for Windows と Windows クレートについて説明しました。
次に、Really Simple Syndication (RSS) フィードからブログ投稿のタイトルをダウンロードする簡単なコンソール アプリを作成して、Windows 用 Rust を試してみましょう。
コマンド プロンプト (
cmd.exe
) を起動し、Rust プロジェクトを保持するフォルダーにcd
します。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 プロジェクトを記述するテキスト ファイルです。これには、依存関係も含まれます。次の一覧に示すように、 ウィンドウ クレートに依存関係を追加します。 ウィンドウ用の クレートは大きい。 ビルド時間を短縮するために、このコードに必要な
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 関数の戻り値の型は、windows::core::からの Resultであることに注意してください。 オペレーティング システム (OS) API からのエラーに対処するのが一般的であるため、処理が容易になります。 windows::core::Result は、エラー伝達と簡潔なエラー処理に役立ちます。
コード行の末尾に疑問符演算子が表示されます。 入力を節約するために、Rust のエラー伝達と短絡ロジックを使用します。 つまり、この簡単な例では、一連の手動エラー処理を行う必要はありません。 Rust のこの機能の詳細については、を参照してください。のエラー処理を容易にする演算子です。
また、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 の規約に従って、コンストラクターをnewと名付けています。
これで、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! チュートリアル (VS Code を使用した Rust) が正常に完了していることを確認してください。
また、テキストエディター内には、デバッグ コマンドと 実行 コマンドも埋め込まれています。 または、
rss_reader
フォルダーのコマンド プロンプトから「cargo run
」と入力します。これにより、プログラムがビルドされて実行されます。VS Code ターミナル ペインで、Cargo が ウィンドウをクレート 正常にダウンロードしてコンパイルし、結果をキャッシュし、それらを使用して後続のビルドを短時間で完了していることがわかります。 次に、サンプルをビルドして実行し、ブログ投稿タイトルの一覧を表示します。
これは、Windows 用の Rust をプログラムするのと同じくらい簡単です。 内部では、Rust が ECMA-335 (共通言語インフラストラクチャ、または CLI) に基づいて
メッセージ ボックスの表示
Rust for Windows では、任意の Windows API (過去、現在、将来) を呼び出すことができます。 このセクションでは、いくつかの Windows メッセージ ボックスを示します。
RSS プロジェクトの場合と同様に、コマンド プロンプトで Rust プロジェクトを含むフォルダーに
cd
します。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++ を念頭に置いて記述されているため、 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!マクロを用いてHSTRINGをrss_readerで生成したのと同様に。 Rust は UTF-8 文字列を使用したネイティブ Unicode であるため、ANSI (A サフィックス) API よりもワイド Unicode (W サフィックス) Windows API を使用することをお勧めします。 これは、コードで英語以外のテキストを使用する場合に重要な場合があります。
今回ビルドして実行すると、Rust に 2 つの Windows メッセージ ボックスが表示されます。
関連事項
Windows developer