Bagikan melalui


Cara: Mengaktifkan dan Menggunakan Komponen Runtime Windows Menggunakan WRL

Dokumen ini menunjukkan cara menggunakan Windows Runtime C++ Template Library (WRL)untuk menginisialisasi Windows Runtime dan cara mengaktifkan dan menggunakan komponen Windows Runtime.

Untuk menggunakan komponen, Anda harus memperoleh penunjuk antarmuka ke jenis yang diimplementasikan oleh komponen. Dan karena teknologi yang mendasari Windows Runtime adalah Model Objek Komponen (COM), Anda harus mengikuti aturan COM untuk mempertahankan instans jenis. Misalnya, Anda harus mempertahankan jumlah referensi yang menentukan kapan jenis dihapus dari memori.

Untuk menyederhanakan penggunaan Windows Runtime, Windows Runtime C++ Template Library menyediakan templat penunjuk cerdas, ComPtr<T>, yang secara otomatis melakukan penghitungan referensi. Saat Anda mendeklarasikan variabel, tentukan ComPtr<pengidentifikasi nama>antarmuka. Untuk mengakses anggota antarmuka, terapkan operator akses anggota panah (->) ke pengidentifikasi.

Penting

Saat Anda memanggil fungsi antarmuka, selalu uji nilai pengembalian HRESULT.

Mengaktifkan dan Menggunakan Komponen Runtime Windows

Langkah-langkah berikut menggunakan Windows::Foundation::IUriRuntimeClass antarmuka untuk menunjukkan cara membuat pabrik aktivasi untuk komponen Windows Runtime, membuat instans komponen tersebut, dan mengambil nilai properti. Mereka juga menunjukkan cara menginisialisasi Windows Runtime. Contoh lengkapnya adalah sebagai berikut.

Penting

Meskipun Anda biasanya menggunakan Pustaka Templat Windows Runtime C++ di aplikasi Platform Windows Universal (UWP), contoh ini menggunakan aplikasi konsol untuk ilustrasi. Fungsi seperti wprintf_s tidak tersedia dari aplikasi UWP. Untuk informasi selengkapnya tentang jenis dan fungsi yang dapat Anda gunakan di aplikasi UWP, lihat Fungsi CRT yang tidak didukung di aplikasi Platform Windows Universal dan Win32 dan COM untuk aplikasi UWP.

Untuk mengaktifkan dan menggunakan komponen Windows Runtime

  1. Sertakan (#include) Runtime Windows yang diperlukan, Pustaka Templat Windows Runtime C++, atau header Pustaka Standar C++.

    #include <Windows.Foundation.h>
    #include <wrl\wrappers\corewrappers.h>
    #include <wrl\client.h>
    #include <stdio.h>
    
    using namespace ABI::Windows::Foundation;
    using namespace Microsoft::WRL;
    using namespace Microsoft::WRL::Wrappers;
    

    Kami menyarankan agar Anda menggunakan arahan using namespace dalam file .cpp Anda untuk membuat kode lebih mudah dibaca.

  2. Inisialisasi utas tempat aplikasi dijalankan. Setiap aplikasi harus menginisialisasi model utas dan utasnya. Contoh ini menggunakan kelas Microsoft::WRL::Wrappers::RoInitializeWrapper untuk menginisialisasi Windows Runtime dan menentukan RO_INIT_MULTITHREADED sebagai model utas. Kelas RoInitializeWrapper memanggil Windows::Foundation::Initialize saat konstruksi, dan Windows::Foundation::Uninitialize ketika dihancurkan.

    // Initialize the Windows Runtime.
    RoInitializeWrapper initialize(RO_INIT_MULTITHREADED);
    if (FAILED(initialize))
    {
        return PrintError(__LINE__, initialize);
    }
    

    Dalam pernyataan kedua, operator RoInitializeWrapper::HRESULT mengembalikan HRESULT dari panggilan ke Windows::Foundation::Initialize.

  3. Buat pabrik aktivasi untuk ABI::Windows::Foundation::IUriRuntimeClassFactory antarmuka.

    // Get the activation factory for the IUriRuntimeClass interface.
    ComPtr<IUriRuntimeClassFactory> uriFactory;
    HRESULT hr = GetActivationFactory(HStringReference(RuntimeClass_Windows_Foundation_Uri).Get(), &uriFactory);
    if (FAILED(hr))
    {
        return PrintError(__LINE__, hr);
    }
    

    Windows Runtime menggunakan nama yang sepenuhnya memenuhi syarat untuk mengidentifikasi jenis. Parameter RuntimeClass_Windows_Foundation_Uri adalah string yang disediakan oleh Windows Runtime dan berisi nama kelas runtime yang diperlukan.

  4. Inisialisasi variabel Microsoft::WRL::Wrappers::HString yang mewakili URI "https://www.microsoft.com".

    // Create a string that represents a URI.
    HString uriHString;
    hr = uriHString.Set(L"http://www.microsoft.com");
    if (FAILED(hr))
    {
        return PrintError(__LINE__, hr);
    }
    

    Di Windows Runtime, Anda tidak mengalokasikan memori untuk string yang akan digunakan Windows Runtime. Sebagai gantinya, Windows Runtime membuat salinan string Anda dalam buffer yang dipertahankan dan digunakan untuk operasi, lalu mengembalikan handel ke buffer yang dibuatnya.

  5. IUriRuntimeClassFactory::CreateUri Gunakan metode pabrik untuk membuat ABI::Windows::Foundation::IUriRuntimeClass objek.

    // Create the IUriRuntimeClass object.
    ComPtr<IUriRuntimeClass> uri;
    hr = uriFactory->CreateUri(uriHString.Get(), &uri);
    if (FAILED(hr))
    {
        return PrintError(__LINE__, hr);
    }
    
  6. IUriRuntimeClass::get_Domain Panggil metode untuk mengambil nilai Domain properti.

    // Get the domain part of the URI.
    HString domainName;
    hr = uri->get_Domain(domainName.GetAddressOf());
    if (FAILED(hr))
    {
        return PrintError(__LINE__, hr);
    }
    
  7. Cetak nama domain ke konsol dan kembalikan. Semua ComPtr objek RAII dan meninggalkan cakupan dan dirilis secara otomatis.

    // Print the domain name and return.
    wprintf_s(L"Domain name: %s\n", domainName.GetRawBuffer(nullptr));
    
    // All smart pointers and RAII objects go out of scope here.
    

    Fungsi WindowsGetStringRawBuffer mengambil bentuk Unicode yang mendasar dari string URI.

Berikut adalah contoh lengkapnya:

// wrl-consume-component.cpp
// compile with: runtimeobject.lib
#include <Windows.Foundation.h>
#include <wrl\wrappers\corewrappers.h>
#include <wrl\client.h>
#include <stdio.h>

using namespace ABI::Windows::Foundation;
using namespace Microsoft::WRL;
using namespace Microsoft::WRL::Wrappers;

// Prints an error string for the provided source code line and HRESULT
// value and returns the HRESULT value as an int.
int PrintError(unsigned int line, HRESULT hr)
{
    wprintf_s(L"ERROR: Line:%d HRESULT: 0x%X\n", line, hr);
    return hr;
}

int wmain()
{
    // Initialize the Windows Runtime.
    RoInitializeWrapper initialize(RO_INIT_MULTITHREADED);
    if (FAILED(initialize))
    {
        return PrintError(__LINE__, initialize);
    }

    // Get the activation factory for the IUriRuntimeClass interface.
    ComPtr<IUriRuntimeClassFactory> uriFactory;
    HRESULT hr = GetActivationFactory(HStringReference(RuntimeClass_Windows_Foundation_Uri).Get(), &uriFactory);
    if (FAILED(hr))
    {
        return PrintError(__LINE__, hr);
    }

    // Create a string that represents a URI.
    HString uriHString;
    hr = uriHString.Set(L"http://www.microsoft.com");
    if (FAILED(hr))
    {
        return PrintError(__LINE__, hr);
    }

    // Create the IUriRuntimeClass object.
    ComPtr<IUriRuntimeClass> uri;
    hr = uriFactory->CreateUri(uriHString.Get(), &uri);
    if (FAILED(hr))
    {
        return PrintError(__LINE__, hr);
    }

    // Get the domain part of the URI.
    HString domainName;
    hr = uri->get_Domain(domainName.GetAddressOf());
    if (FAILED(hr))
    {
        return PrintError(__LINE__, hr);
    }

    // Print the domain name and return.
    wprintf_s(L"Domain name: %s\n", domainName.GetRawBuffer(nullptr));

    // All smart pointers and RAII objects go out of scope here.
}
/*
Output:
Domain name: microsoft.com
*/

Mengompilasi Kode

Untuk mengkompilasi kode, salin lalu tempelkan dalam proyek Visual Studio, atau tempelkan dalam file yang diberi nama wrl-consume-component.cpp lalu jalankan perintah berikut di jendela Prompt Perintah Visual Studio.

cl.exe wrl-consume-component.cpp runtimeobject.lib

Baca juga

Pustaka Templat Windows Runtime C++ (WRL)