Postupy: Přímé vytváření instancí komponent knihovny WRL
Naučte se používat prostředí Windows Runtime knihovnu šablon jazyka C++ (WRL)Microsoft::WRL::Make a Microsoft::WRL::D etails::MakeAndInitialize funkcí k vytvoření instance komponenty z modulu, který ji definuje.
Pokud není zapotřebí používat továrny tříd nebo jiné mechanismy, je možné přímým vytvořením instance komponenty snížit režii. Komponentu můžete vytvořit přímo v aplikacích Univerzální platforma Windows i v desktopových aplikacích.
Informace o tom, jak pomocí prostředí Windows Runtime knihovny šablon jazyka C++ vytvořit klasickou komponentu MODELU COM a vytvořit instanci z externí desktopové aplikace, najdete v tématu Postupy: Vytvoření klasické komponenty modelu COM.
Tento dokument popisuje dva příklady. První příklad používá pro vytvoření instance komponenty funkci Make
. V druhém příkladu se pro vytvoření instance komponenty, která může v průběhu vytváření selhat, používá funkce MakeAndInitialize
. (Vzhledem k tomu, že com obvykle používá hodnoty HRESULT místo výjimek k označení chyb, typ COM obvykle nevyvolá z jeho konstruktoru. MakeAndInitialize
umožňuje komponentě ověřit své stavební argumenty prostřednictvím RuntimeClassInitialize
metody.) Oba příklady definují základní protokolovací rozhraní a implementují toto rozhraní definováním třídy, která zapisuje zprávy do konzoly.
Důležité
Operátor nelze použít new
k vytvoření instance prostředí Windows Runtime komponent knihovny šablon jazyka C++. Proto je doporučeno pro přímé vytvoření instance komponenty vždy používat Make
nebo MakeAndInitialize
.
Vytvoření instance komponenty pro základní nástroj pro protokolování
V sadě Visual Studio vytvořte projekt konzolové aplikace Win32. Projekt pojmenujte například WRLLogger.
Do projektu přidejte soubor Midl File (.idl), pojmenujte ho
ILogger.idl
a pak přidejte tento kód:import "ocidl.idl"; // Prints text to the console. [uuid(AFDB9683-F18A-4B85-90D1-B6158DAFA46C)] interface ILogger : IUnknown { HRESULT Log([in] LPCWSTR text); }
Pomocí následujícího kódu nahraďte obsah souboru
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. */
Zpracování chyby při vytváření komponenty základního nástroje pro protokolování
Pro nahrazení definice třídy
CConsoleWriter
použijte následující kód. Tato verze obsahuje členskou proměnnou soukromého řetězce a přepisuje metoduRuntimeClass::RuntimeClassInitialize
.RuntimeClassInitialize
selže, pokud voláníSHStrDup
selže.// 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); } };
Pro nahrazení definice
wmain
použijte následující kód. Tato verze používáMakeAndInitialize
k vytvoření instance objektuCConsoleWriter
a kontroluje výsledek 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. */
Viz také
Knihovna šablon C++ prostředí Windows Runtime (WRL)
Microsoft::WRL::Make
Microsoft::WRL::D etails::MakeAndInitialize