如何:直接執行個體化 WRL 元件
了解如何使用 Windows 執行階段 C++ 範本庫(WRL)Microsoft::WRL::Make和Microsoft::WRL::Details::MakeAndInitialize這兩隻函式,從定義元件的模組中具現化元件。
您可以直接具現化元件,在您不需要 Class Factory 或其他機制時來減少額外負荷。 您可以在 Windows 市集 應用程式與傳統型應用程式中直接具現化元件。
若要了解如何使用 WRL 建立基本 Windows 執行階段 元件,以及從外部 Windows 市集 應用程式具現化,請參閱 逐步解說:使用 WRL 建立基本 Windows 執行階段元件。 若要了解如何使用 WRL 建立典型COM 元件,以及從外部傳統型應用程式具現化,請參閱 如何:使用 WRL 建立傳統 COM 元件 。
這個文件顯示兩個範例。 第一個範例會使用 Make 函式產生元件。 第二個範例會使用 MakeAndInitialize 函式具現化在建構期間可能會失敗的元件。(由於 COM 一般會使用 HRESULT 值取代例外狀況來表示錯誤, COM 型別通常不會從它的建構函式擲回。 MakeAndInitialize 可讓元件透過 RuntimeClassInitialize 方法驗證其建構函式引數)。以上兩個範例皆會定義基本記錄器介面,並藉由定義會寫入訊息至主控台的類別實作該介面。
重要
您不能使用 new 運算子執行個體化 WRL 元件。因此,建議您一律使用 Make 或 MakeAndInitialize 直接產生元件。
建立及初始化基本記錄器元件
在 Visual Studio 中建立Win32 主控台應用程式專案。 命名專案,例如WRLLogger。
將 [Midl 檔案 (.idl)] 檔案加到專案,並將檔案命名為 ILogger.idl,然後將下列程式碼:
import "ocidl.idl"; // Prints text to the console. [uuid(AFDB9683-F18A-4B85-90D1-B6158DAFA46C)] interface ILogger : IUnknown { HRESULT Log([in] LPCWSTR text); }
以下列程式碼取代 WRLLogger.cpp 的內容:
#include "stdafx.h" #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. */
處理基本記錄器元件的建構失敗
以下列程式碼取代 CConsoleWriter 類別的定義。 此版本保留私用字串成員變數並覆寫 RuntimeClass::RuntimeClassInitialize 方法。 如果對 SHStrDup 的呼叫失敗,RuntimeClassInitialize 會失敗。
// 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); } };
將 wmain 的定義替換成下列程式碼。 這個版本使用 MakeAndInitialize 具現化 CConsoleWriter 物件並檢查 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. */
請參閱
參考
Microsoft::WRL::Details::MakeAndInitialize