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
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.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
memanggilWindows::Foundation::Initialize
saat konstruksi, danWindows::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 keWindows::Foundation::Initialize
.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.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.
IUriRuntimeClassFactory::CreateUri
Gunakan metode pabrik untuk membuatABI::Windows::Foundation::IUriRuntimeClass
objek.// Create the IUriRuntimeClass object. ComPtr<IUriRuntimeClass> uri; hr = uriFactory->CreateUri(uriHString.Get(), &uri); if (FAILED(hr)) { return PrintError(__LINE__, hr); }
IUriRuntimeClass::get_Domain
Panggil metode untuk mengambil nilaiDomain
properti.// Get the domain part of the URI. HString domainName; hr = uri->get_Domain(domainName.GetAddressOf()); if (FAILED(hr)) { return PrintError(__LINE__, hr); }
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
Saran dan Komentar
https://aka.ms/ContentUserFeedback.
Segera hadir: Sepanjang tahun 2024 kami akan menghentikan penggunaan GitHub Issues sebagai mekanisme umpan balik untuk konten dan menggantinya dengan sistem umpan balik baru. Untuk mengetahui informasi selengkapnya, lihat:Kirim dan lihat umpan balik untuk