Cara: Membuat Instans Komponen WRL Secara Langsung
Pelajari cara menggunakan Windows Runtime C++ Template Library (WRL)Microsoft::WRL::Make dan Microsoft::WRL::D etails::MakeAndInitialize functions untuk membuat instans komponen dari modul yang mendefinisikannya.
Dengan membuat instans komponen secara langsung, Anda dapat mengurangi overhead ketika Anda tidak memerlukan pabrik kelas atau mekanisme lainnya. Anda dapat membuat instans komponen langsung di aplikasi Platform Windows Universal dan di aplikasi desktop.
Untuk mempelajari cara menggunakan Windows Runtime C++ Template Library untuk membuat komponen COM klasik dan membuat instans dari aplikasi desktop eksternal, lihat Cara: Membuat Komponen COM Klasik.
Dokumen ini memperlihatkan dua contoh. Contoh pertama menggunakan Make
fungsi untuk membuat instans komponen. Contoh kedua menggunakan MakeAndInitialize
fungsi untuk membuat instans komponen yang dapat gagal selama konstruksi. (Karena COM biasanya menggunakan nilai HRESULT, alih-alih pengecualian, untuk menunjukkan kesalahan, jenis COM biasanya tidak dilemparkan dari konstruktornya. MakeAndInitialize
memungkinkan komponen untuk memvalidasi argumen konstruksinya melalui RuntimeClassInitialize
metode .) Kedua contoh menentukan antarmuka pencatat dasar dan mengimplementasikan antarmuka tersebut dengan menentukan kelas yang menulis pesan ke konsol.
Penting
Anda tidak dapat menggunakan new
operator untuk membuat instans komponen Pustaka Templat C++ Windows Runtime. Oleh karena itu, kami sarankan Anda selalu menggunakan Make
atau MakeAndInitialize
membuat instans komponen secara langsung.
Untuk membuat dan membuat instans komponen pencatat dasar
Di Visual Studio, buat proyek Aplikasi Konsol Win32. Beri nama proyek, misalnya, WRLLogger.
Tambahkan file Midl File (.idl) ke proyek, beri nama file
ILogger.idl
, lalu tambahkan kode ini:import "ocidl.idl"; // Prints text to the console. [uuid(AFDB9683-F18A-4B85-90D1-B6158DAFA46C)] interface ILogger : IUnknown { HRESULT Log([in] LPCWSTR text); }
Gunakan kode berikut untuk menggantikan konten
WRLLogger.cpp
.#include "pch.h" // Use stdafx.h in Visual Studio 2017 and earlier #include <wrl\implements.h> #include <comutil.h> #include "ILogger_h.h" using namespace Microsoft::WRL; // Writes logging messages to the console. class CConsoleWriter : public RuntimeClass<RuntimeClassFlags<ClassicCom>, ILogger> { public: STDMETHODIMP Log(_In_ PCWSTR text) { wprintf_s(L"%s\n", text); return S_OK; } private: // Make destroyable only through Release. ~CConsoleWriter() { } }; int wmain() { ComPtr<CConsoleWriter> writer = Make<CConsoleWriter>(); HRESULT hr = writer->Log(L"Logger ready."); return hr; } /* Output: Logger ready. */
Untuk menangani kegagalan konstruksi untuk komponen pencatat dasar
Gunakan kode berikut untuk mengganti definisi
CConsoleWriter
kelas. Versi ini menyimpan variabel anggota string privat dan mengambilRuntimeClass::RuntimeClassInitialize
alih metode .RuntimeClassInitialize
gagal jika panggilan gagalSHStrDup
.// Writes logging messages to the console. class CConsoleWriter : public RuntimeClass<RuntimeClassFlags<ClassicCom>, ILogger> { public: // Initializes the CConsoleWriter object. // Failure here causes your object to fail construction with the HRESULT you choose. HRESULT RuntimeClassInitialize(_In_ PCWSTR category) { return SHStrDup(category, &m_category); } STDMETHODIMP Log(_In_ PCWSTR text) { wprintf_s(L"%s: %s\n", m_category, text); return S_OK; } private: PWSTR m_category; // Make destroyable only through Release. ~CConsoleWriter() { CoTaskMemFree(m_category); } };
Gunakan kode berikut untuk mengganti definisi
wmain
. Versi ini menggunakan untuk membuatCConsoleWriter
instansMakeAndInitialize
objek dan memeriksa hasil HRESULT.int wmain() { ComPtr<CConsoleWriter> writer; HRESULT hr = MakeAndInitialize<CConsoleWriter>(&writer, L"INFO"); if (FAILED(hr)) { wprintf_s(L"Object creation failed. Result = 0x%x", hr); return hr; } hr = writer->Log(L"Logger ready."); return hr; } /* Output: INFO: Logger ready. */
Baca juga
Pustaka Templat Windows Runtime C++ (WRL)
Microsoft::WRL::Make
Microsoft::WRL::D etails::MakeAndInitialize
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