Procedura: creare direttamente un'istanza dei componenti WRL
Informazioni su come usare la libreria di modelli C++ di Windows Runtime (WRL)Microsoft::WRL::Make e Microsoft::WRL::D etails::MakeAndInitialize per creare un'istanza di un componente dal modulo che lo definisce.
Creando direttamente un'istanza dei componenti, è possibile ridurre il sovraccarico quando non sono necessarie class factory o altri meccanismi. È possibile creare un'istanza di un componente direttamente nelle app piattaforma UWP (Universal Windows Platform) e nelle app desktop.
Per informazioni su come usare la libreria di modelli C++ di Windows Runtime per creare un componente COM classico e crearne un'istanza da un'app desktop esterna, vedere Procedura: Creare un componente COM classico.
Questo documento illustra due esempi. Il primo esempio usa la Make
funzione per creare un'istanza di un componente. Il secondo esempio usa la MakeAndInitialize
funzione per creare un'istanza di un componente che può non riuscire durante la costruzione. Poiché COM usa in genere valori HRESULT, anziché eccezioni, per indicare errori, un tipo COM in genere non genera un'eccezione dal relativo costruttore. MakeAndInitialize
consente a un componente di convalidare gli argomenti di costruzione tramite il RuntimeClassInitialize
metodo . Entrambi gli esempi definiscono un'interfaccia logger di base e implementano tale interfaccia definendo una classe che scrive messaggi nella console.
Importante
Non è possibile usare l'operatore per creare un'istanza new
dei componenti della libreria di modelli C++ di Windows Runtime. Pertanto, è consigliabile usare Make
sempre o MakeAndInitialize
per creare un'istanza diretta di un componente.
Per creare e creare un'istanza di un componente logger di base
In Visual Studio creare un progetto applicazione console Win32. Denominare il progetto, ad esempio WRLLogger.
Aggiungere un file Midl File (con estensione idl) al progetto, denominare il file
ILogger.idl
e quindi aggiungere questo codice:import "ocidl.idl"; // Prints text to the console. [uuid(AFDB9683-F18A-4B85-90D1-B6158DAFA46C)] interface ILogger : IUnknown { HRESULT Log([in] LPCWSTR text); }
Usare il codice seguente per sostituire il contenuto di
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. */
Per gestire gli errori di costruzione per il componente logger di base
Usare il codice seguente per sostituire la definizione della
CConsoleWriter
classe . Questa versione contiene una variabile membro di stringa privata ed esegue l'override delRuntimeClass::RuntimeClassInitialize
metodo .RuntimeClassInitialize
ha esito negativo se la chiamata aSHStrDup
non riesce.// 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); } };
Usare il codice seguente per sostituire la definizione di
wmain
. Questa versione usaMakeAndInitialize
per creare un'istanza dell'oggettoCConsoleWriter
e controlla il risultato 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. */
Vedi anche
Libreria modelli C++ per Windows Runtime
Microsoft::WRL::Make
Microsoft::WRL::D etails::MakeAndInitialize