Cómo: Crear instancias de componentes WRL directamente
Obtenga información sobre cómo utilizar Biblioteca de plantillas de Windows Runtime C++ (WRL) Microsoft::WRL::Make y las funciones de Microsoft::WRL::Details::MakeAndInitialize para crear instancias de un componente de módulo que lo define.
Creando instancias de componentes directamente, puede reducir la sobrecarga cuando no necesite generadores de clases u otros mecanismos.Puede crear instancias de un componente directamente en las aplicaciones de Tienda Windows y en aplicaciones de escritorio.
Para obtener información sobre cómo usar para crear un componente básico de Windows en tiempo de ejecución y para crear instancias de una aplicación externa de Tienda Windows, vea Tutorial: Crear un componente básico de Windows en tiempo de ejecución mediante WRL.Para obtener información sobre cómo usar WRL para crear un componente COM clásico y para crear instancias de una aplicación de escritorio externa, vea Cómo: Crear un componente COM clásico mediante WRL.
Este documento se muestran dos ejemplos.El primer ejemplo utiliza la función de Make para crear instancias de un componente.El segundo ejemplo utiliza la función de MakeAndInitialize para crear instancias de un componente que pueden producir errores durante la construcción.(Dado que utiliza COM normalmente valores de HRESULT, en lugar de excepciones, para indicar errores, un tipo COM no produce normalmente de su constructor.MakeAndInitialize permite a un componente para validar los argumentos de la construcción con el método de RuntimeClassInitialize .) Ambos ejemplos definen una interfaz básica de registrador e implementar esa interfaz definiendo una clase que se escribe mensajes en la consola.
Importante |
---|
No puede utilizar el operador de new para crear instancias de los componentes de WRL.Por consiguiente, se recomienda usar siempre Make o MakeAndInitialize para crear instancias de un componente directamente. |
Para crear y crear instancias de un componente básico de registrador
En Visual Studio, cree un proyecto Aplicación de consola Win32.Denomine el proyecto, por ejemplo, WRLLogger.
Agregue un archivo Archivo MIDL (.idl) al proyecto, llame al archivo ILogger.idl, y después agregue este código:
import "ocidl.idl"; // Prints text to the console. [uuid(AFDB9683-F18A-4B85-90D1-B6158DAFA46C)] interface ILogger : IUnknown { HRESULT Log([in] BSTR text); }
Utilice el código siguiente para reemplazar el contenido de 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. */
Para controlar el error de la construcción del componente básico de registrador
Utilice el código siguiente para reemplazar la definición de clase de CConsoleWriter.Esta versión contiene una variable miembro privada de la cadena y reemplace el método de RuntimeClass::RuntimeClassInitialize.RuntimeClassInitialize supera si el parámetro proporcionado es 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() { } };
Utilice el código siguiente para reemplazar la definición de _tmain.Esta versión usa MakeAndInitialize para crear instancias de dos objetos de CConsoleWriter.Para obtener una demostración, la primera llamada se realiza correctamente y la segunda llamada producirá un error.
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. */
Vea también
Referencia
Microsoft::WRL::Details::MakeAndInitialize