Procedura: creare direttamente un'istanza dei componenti WRL
Viene descritto come utilizzare Libreria di modelli di Windows Runtime C++ (WRL) Microsoft::WRL::Make e funzioni di Microsoft::WRL::Details::MakeAndInitialize per creare un'istanza di un componente dal modulo che lo definisce.
Creare un'istanza dei componenti direttamente, è possibile ridurre il sovraccarico quando non è necessario disporre di class factory o altri meccanismi.È possibile creare un'istanza di un componente direttamente in entrambe le applicazioni di Windows Store e nelle applicazioni desktop.
Per informazioni su come utilizzare per creare un componente di base di Windows Runtime e per crearne un'istanza da un'applicazione esterna di Windows Store, vedere Procedura dettagliata: creazione di un componente Windows Runtime di base mediante WRL.Per informazioni su come utilizzare WRL per creare un componente COM classica e per crearne un'istanza da un'applicazione desktop esterna, vedere Procedura: creare un componente COM classico mediante WRL.
In questo documento vengono illustrate due esempi.Il primo esempio viene utilizzata la funzione di Make per creare un'istanza di un componente.Nel secondo esempio viene utilizzata la funzione di MakeAndInitialize per creare un'istanza di un componente che può ma durante la costruzione.Poiché il COM utilizza in genere i valori di HRESULT, invece delle eccezioni, per indicare gli errori, un tipo COM in genere non viene generato dal costruttore.MakeAndInitialize consente a un componente per convalidare gli argomenti della costruzione con il metodo di RuntimeClassInitialize ). Entrambi gli esempi definire un'interfaccia di base di logger e implementa tale interfaccia definendo una classe che scrive messaggi nella console.
Importante |
---|
Non è possibile utilizzare l'operatore di new per creare un'istanza dei componenti di WRL.Pertanto, è consigliabile utilizzare sempre Make o MakeAndInitialize per creare direttamente un'istanza di un componente. |
Per creare e creare un'istanza di un componente di base del logger
In Visual Studio, creare un progetto Progetto console Win32.Denominare il progetto, ad esempio, WRLLogger.
Aggiungere un file File Midl (.idl) al progetto, denominare il file ILogger.idlquindi aggiungere il codice seguente:
import "ocidl.idl"; // Prints text to the console. [uuid(AFDB9683-F18A-4B85-90D1-B6158DAFA46C)] interface ILogger : IUnknown { HRESULT Log([in] BSTR text); }
Utilizzare il codice per sostituire il contenuto di WRLLogger.cpp.
#include "stdafx.h" #include <wrl\implements.h> #include <comutil.h> #include "ILogger_h.h" // comutil.h requires static linkage to comsuppw.lib. #pragma comment(lib, "comsuppw") using namespace Microsoft::WRL; // Writes logging messages to the console. class CConsoleWriter : public RuntimeClass<RuntimeClassFlags<ClassicCom>, ILogger> { public: STDMETHODIMP Log(_In_ BSTR text) { if (text == nullptr) { return E_POINTER; } wprintf_s(L"%s\n", text); return S_OK; } private: // Make destroyable only through Release. ~CConsoleWriter() { } }; int _tmain() { ComPtr<CConsoleWriter> writer = Make<CConsoleWriter>(); HRESULT hr = writer->Log(L"Logger ready."); return hr; } /* Output: Logger ready. */
Per gestire gli errori di creazione per il componente di base del logger
Utilizzare il codice seguente per sostituire la definizione della classe di CConsoleWriter.Questa versione utilizza una variabile membro privato della stringa ed esegue l'override del metodo di RuntimeClass::RuntimeClassInitialize.RuntimeClassInitialize non riesce se il parametro fornito è nullptr.
// 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_ BSTR category) { if (category == nullptr) { return E_POINTER; } m_category = category; return S_OK; } STDMETHODIMP Log(_In_ BSTR text) { if (text == nullptr) { return E_POINTER; } wprintf_s(L"%s: %s\n", m_category.GetBSTR(), text); return S_OK; } private: _bstr_t m_category; // Make destroyable only through Release. ~CConsoleWriter() { } };
Utilizzare il codice seguente per sostituire la definizione di _tmain.Questa versione utilizza MakeAndInitialize per creare un'istanza di due oggetti di CConsoleWriter.Per una dimostrazione, la prima chiamata ha esito positivo e l'esito negativo di seconda chiamata.
int _tmain() { BSTR category = L"INFO"; ComPtr<CConsoleWriter> writer; HRESULT hr = MakeAndInitialize<CConsoleWriter>(&writer, category); if (FAILED(hr)) { wprintf_s(L"Object creation failed. Result = 0x%x", hr); return hr; } hr = writer->Log(L"Logger ready."); if (FAILED(hr)) { return hr; } wprintf_s(L"\n"); category = nullptr; hr = MakeAndInitialize<CConsoleWriter>(&writer, category); if (FAILED(hr)) { wprintf_s(L"Object creation failed. Result = 0x%x.\n", hr); return hr; } else { return writer->Log(L"Logger ready."); } } /* Output: INFO: Logger ready. Object creation failed. Result = 0x80004003. */
Vedere anche
Riferimenti
Microsoft::WRL::Details::MakeAndInitialize