이전 주제에서 Windows용 Rust 와 windows 크레이트를 소개했습니다.
이제 RSS(Really Simple Syndication) 피드에서 블로그 게시물의 제목을 다운로드하는 간단한 콘솔 앱을 작성하여 Windows용 Rust를 사용해 보겠습니다.
명령 프롬프트(
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 프로젝트를 설명하는 텍스트 파일입니다.아래 목록과 같이 창 상자에 종속성을 추가합니다. 창 상자가 큽다. 빌드 시간을 빠르게 유지하기 위해 이 코드에
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!" 코드를 찾을 수 있습니다. 다음 use 문을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(()) }기본 함수의 반환 형식은 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 생성자입니다. windows 크레이트의 모든 객체는 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이므로 차단 함수를 사용하여 예제를 단순하게 유지합니다. 또는 함수 내에서 연산자를
awaitasync사용하여 결과를 협조적으로 기다릴 수 있습니다. 그래픽 사용자 인터페이스가 있는 더 복잡한 앱은 자주 사용됩니다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와 VS Code 사용)를 성공적으로 완료했는지 확인하세요.
텍스트 편집기 안에는 디버그 명령과 실행 명령도 포함되어 있습니다. 다른 방법으로는,
rss_reader폴더의 명령 프롬프트에서cargo run을 입력하여 프로그램을 빌드하고 실행할 수 있습니다.
VS Code 터미널 패널에서 Cargo가 Windows 크레이트를 성공적으로 다운로드하고 컴파일하며, 결과를 캐싱하여 향후 빌드가 짧은 시간 내에 완료되도록 사용하는 것을 볼 수 있습니다. 그런 다음 샘플을 빌드하고 실행하여 블로그 게시물 제목 목록을 표시합니다.
이는 Windows용 Rust를 프로그래밍하는 것만큼 간단합니다. 도구를 구축할 때 Rust가 .winmd(공용 언어 인프라 또는 CLI)를 기반으로 파일을 구문 분석하고, 런타임 시 COM 기반 ABI(애플리케이션 이진 인터페이스)를 안전성과 효율성을 염두에 두고 충실하게 따를 수 있도록 많은 정성과 노력이 들어갑니다.
메시지 상자 표시
Windows용 Rust를 사용하면 모든 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++를 염두에 두고 작성되므로 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); } }여기서 볼 수 있듯이 블록에서 이러한 Win32 API를
unsafe사용해야 합니다( 안전하지 않은 블록 참조). 또한 Rust UTF-8 문자열 리터럴에서 LPCSTR 및 LPCWSTR 인수를 생성하는 s! 및 w! 매크로를 확인하세요. 이는 rss_reader에 대해 HSTRING을 생성하기 위해 h! 매크로를 사용한 것과 유사합니다. Rust는 기본적으로 UTF-8 문자열이 있는 유니코드이므로 ANSI(A-접미사) API보다 넓은 유니코드(W-접미사) Windows API를 사용하는 것이 좋습니다. 이는 코드에서 영어가 아닌 텍스트를 사용하는 경우에 중요할 수 있습니다.
이번에는 빌드하고 실행할 때 Rust에 두 개의 Windows 메시지 상자가 표시됩니다.
관련
Windows developer