Aracılığıyla paylaş


RSS okuyucu öğreticisi (VS Code ile Windows için Rust)

Önceki konu başlığında Windows için Rust tanıtıldı ve Windows kütüphanesi.

Şimdi Gerçekten Basit Dağıtım (RSS) akışından blog gönderilerinin başlıklarını indiren basit bir konsol uygulaması yazarak Windows için Rust'ı deneyelim.

  1. Bir komut istemi (cmd.exe) başlatın ve Rust projelerinizi saklamak istediğiniz klasöre cd yapın.

  2. Cargo kullanarak rss_readeradlı yeni bir Rust projesi oluşturun ve yeni oluşturulan klasörde cd yapın:

    > cargo new rss_reader
    >     Created binary (application) `rss_reader` package
    > cd rss_reader
    
  3. Ardından rss_reader projesini VS Code'da açın.

    code .
    
  4. Şimdi ana rss_reader projesini uygulayalım. İlk olarak, projenin kökündeki dosyayı açın Cargo.toml . Cargo.toml Dosya, sahip olduğu bağımlılıklar da dahil olmak üzere Rust projesini açıklayan bir metin dosyasıdır.

    Aşağıdaki listede gösterildiği gibi pencere kasasına bir bağımlılık ekleyin. Windows kasası büyük. Derleme sürelerini hızlı tutmak için yalnızca Foundation_Collections bu kod için ihtiyacımız olan ve Web_Syndication özelliklerini seçeceğiz.

    # Cargo.toml
    ...
    
    [dependencies.windows] 
    version = "0.43.0"
    features = [
        "Foundation_Collections",
        "Web_Syndication",
    ]
    
  5. Ardından , rss_reader projenin src/main.rs kaynak kodu dosyasını açın. Burada Kargo varsayılan "Merhaba, dünya!" kodunu bulacaksınız. aşağıdaki deyimini main.rsbaşına ekleyin:

    // src\main.rs
    use windows::{
        core::*,
        Foundation::Uri,
        Web::Syndication::SyndicationClient
    };
    
    fn main() {
        println!("Hello, world!");
    }
    

    kullanımı bildirimi, kullanacağımız türlerin yolunu kısaltır. Daha önce bahsettiğimiz Uri türü var.

  6. Yeni bir Uri oluşturmak için Kargo'nun varsayılan ana işlevini şu değerle değiştirin:

    // src\main.rs
    ...
    
    fn main() -> Result<()> {
        let uri = Uri::CreateUri(h!("https://blogs.windows.com/feed"))?;
    
        Ok(())
    }
    

    ana işlevinin dönüş türünün windows::core::içerisindeki Resultolduğunu unutmayın. Bu, işletim sistemi (OS) API'lerinden gelen hatalarla başa çıkmak yaygın olduğu için işleri kolaylaştırır. windows::core::Result hata yayılması ve özlü hata işleme konusunda bize yardımcı olur.

    Kod satırının sonunda soru işareti işlecini görebilirsiniz. Yazmadan tasarruf etmek için Rust'ın hata yayma ve kısa devre mantığını kullanmak için bunu yaparız. Bu, bu basit örnek için el ile hata işleme yapmak zorunda olmadığımız anlamına gelir. Rust'ın bu özelliği hakkında daha fazla bilgi için bkz. Kolay hata yönetimi için ? işlecisi.

    Ayrıca h! makrosunu Windows kasasından dikkat edin. Rust dizgi sabitinden HSTRING referansı oluşturmak için bunu kullanırız. WinRT API, dize değerleri için HSTRING'i kapsamlı bir şekilde kullanır.

  7. RSS akışını indirmek için yeni bir SyndicationClient oluşturacağız.

    // src\main.rs
    ...
    
    fn main() -> windows::core::Result<()> {
        let uri = Uri::CreateUri(h!("https://blogs.windows.com/feed"))?;
        let client = SyndicationClient::new()?;
    
        Ok(())
    }
    

    Yeni işlevi bir Rust oluşturucusudur. pencereler kasasındaki tüm nesneler Rust kuralını izler ve oluşturucuları yeniolarak adlandırılır.

  8. Artık akışı almak için SyndicationClient'ı kullanabiliriz.

    // 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 zaman uyumsuz bir API olduğundan, örneği basit tutmak için engelleme get işlevini kullanırız. Alternatif olarak, sonuçları işbirliği içinde beklemek amacıyla bir await işlevi içindeki async işlecini kullanabiliriz. Grafik kullanıcı arabirimine sahip daha karmaşık bir uygulama sık sık kullanır async.

  9. Şimdi sonuçta elde edilen öğeleri yineleyebilir ve yalnızca başlıkları yazdırabiliriz. Bazı RSS akışları bunu gerektirdiğinden, kullanıcı aracısı üst bilgisini ayarlamak için aşağıda birkaç ek kod satırı da görürsünüz.

    // 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. Şimdi Çalıştır>Hata Ayıklamadan Çalıştır 'a tıklayarak (veya Ctrl+F5) basarak oluşturup çalıştırabildiğimizi onaylayalım. Eğer beklenmedik mesajlar görürseniz, VS Code ile Rust kullanarak Hello, world! öğreticisini başarıyla tamamladığınızdan emin olun.

    Ayrıca metin düzenleyicisine eklenmiş Hata Ayıklama ve Çalıştır komutları da vardır. Alternatif olarak, rss_reader klasöründeki bir komut isteminde cargo run yazın; bu, programı derleyip çalıştıracaktır.

    Metin düzenleyicisine eklenmiş Hata Ayıklama ve Çalıştırma komutları

    VS Code Terminal bölmesinde, Cargo'nun Windows işletim sistemi paketini başarıyla indirdiğini ve derlediğini, sonuçları önbelleğe alarak, böylece sonraki derlemelerin daha kısa sürede tamamlanmasını sağlamak için kullanmakta olduğunu görebilirsiniz. Ardından örneği oluşturur ve çalıştırarak blog gönderisi başlıklarının listesini görüntüler.

    Blog gönderisi başlıklarının listesi

Bu, Windows için Rust'ı programlamak kadar basittir. Bununla birlikte, arka planda, Rust'ın .winmd (Ortak Dil Altyapısı veya CLI) temelinde dosyalarını ayrıştırabilmesi ve çalışma zamanında COM tabanlı uygulama ikili arabirimine (ABI) güvenlik ve verimlilik ön planda tutularak sadık kalabilmesi için araçları geliştirmeye büyük bir özen gösterilir.

İleti kutusunu gösterme

Windows için Rust'ın herhangi bir Windows API'sini (geçmiş, mevcut ve gelecek) çağırmanıza olanak tanır dedik. Bu nedenle bu bölümde birkaç Windows ileti kutusu göstereceğiz.

  1. RSS projesinde yaptığımız gibi, komut isteminde cd komutunu kullanarak Rust projelerinizin bulunduğu klasöre gidin.

  2. message_box adlı yeni bir proje oluşturun ve bunu VS Code'da açın:

    > cargo new message_box
    >     Created binary (application) `message_box` package
    > cd message_box
    > code .
    
  3. VS Code'da dosyasını açın Cargo.tomlve bu proje için Windows bağımlılıklarını ekleyin:

     # message_box\Cargo.toml
     ...
    
     [dependencies.windows]
     version = "0.43.0"
     features = [
         "Win32_Foundation",
         "Win32_UI_WindowsAndMessaging",
     ]
    
  4. Şimdi projenin src/main.rs dosyasını açın ve aşağıda gösterildiği gibi yeni ad alanlarıyla use bildirimlerini ekleyin. Son olarak, MessageBoxA ve MessageBoxW işlevlerini çağırmak için kod ekleyin. Windows API belgeleri çoğunlukla C/C++ göz önünde bulundurularak yazılır, bu nedenle API belgelerini windows kasasında Rust projeksiyonları için belgelerle karşılaştırmak yararlı olur: MessageBoxA (Rust) ve 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);
        }
    }
    

    Gördüğünüz gibi, bu Win32 API'lerini bir unsafe blokta kullanmamız gerekir (bkz . Güvenli olmayan bloklar). Ayrıca not edin! ve w! rust UTF-8 dize değişmez değerlerinden LPCSTR ve LPCWSTR bağımsız değişkenleri makrolar; aynı h ile bir HSTRING oluşturduğumuz gibi! rss_readeriçin makro. Rust, UTF-8 dizeleriyle doğal olarak Unicode olduğundan, ANSI (A-soneki) API'ler yerine geniş Unicode (W-soneki) Windows API'lerinin kullanılması tercih edilir. Kodunuzda İngilizce olmayan metinler kullanıyorsanız bu önemli olabilir.

Bu kez oluşturup çalıştırdığınızda Rust iki Windows ileti kutusu görüntüler.