Como instanciar componentes WRL diretamente
Saiba como usar Biblioteca em Tempo de Execução C++ do Tempo de Execução do Windows (WRL) Microsoft::WRL::Make e funções de Microsoft::WRL::Details::MakeAndInitialize para criar uma instância de um componente do módulo que define o.
Criando uma instância do componente diretamente, você pode reduzir a sobrecarga quando não precisar fábricas da classe ou outros mecanismos. Você pode criar uma instância de um componente diretamente em ambos os aplicativos de Windows Store e em aplicativos de área de trabalho.
Para saber como usar WRL para criar um componente básico de Tempo de Execução do Windows e para criar-lo uma instância de um aplicativo externo de Windows Store , consulte Instruções passo a passo: criando um componente básico de Tempo de Execução do Windows com WRL. Para saber como usar WRL para criar um componente COM clássico e para criar-lo uma instância de um aplicativo externo de área de trabalho, consulte Como criar um componente COM clássico com WRL.
Este documento mostra dois exemplos. O primeiro exemplo usa a função de Make para criar uma instância de um componente. O segundo exemplo usa a função de MakeAndInitialize para criar uma instância de um componente que pode falhar durante a compilação. (Porque COM geralmente usa valores de HRESULT , em vez de exceções, para indicar erros, um tipo de COM normalmente não lança do construtor. MakeAndInitialize permite que um componente para validar seus argumentos de compilação com o método de RuntimeClassInitialize .) Os dois exemplos definem uma interface e implemente básicos de agente que têm interface definindo uma classe que mensagens de gravações no console.
Importante
Você não pode usar o operador de new para criar uma instância componentes de WRL .Consequentemente, recomendamos que você sempre use Make ou MakeAndInitialize para criar uma instância diretamente um componente.
Para criar uma instância de um componente básico do registrador
No Visual Studio, crie um projeto de Aplicativo do Console Win32 . O nome do projeto, por exemplo, WRLLogger.
Adicionar um arquivo de Midl Arquivo (.idl) ao projeto, nomeie o arquivo ILogger.idl, e adicione esse código:
import "ocidl.idl"; // Prints text to the console. [uuid(AFDB9683-F18A-4B85-90D1-B6158DAFA46C)] interface ILogger : IUnknown { HRESULT Log([in] LPCWSTR text); }
Use o código a seguir para substituir o conteúdo de 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. */
Para controlar a falha de compilação para o componente básico do registrador
Use o código a seguir para substituir a definição da classe de CConsoleWriter . Esta versão mantém uma variável de membro particular de cadeia de caracteres e substitui o método de RuntimeClass::RuntimeClassInitialize . RuntimeClassInitialize falha se a chamada a SHStrDup falha.
// 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); } };
Use o código a seguir para substituir a definição de wmain. Esta versão MakeAndInitialize usa para criar uma instância do objeto de CConsoleWriter e verifica o resultado de 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. */
Consulte também
Referência
Microsoft::WRL::Details::MakeAndInitialize
Conceitos
Biblioteca de Modelos C++ do Tempo de Execução do Windows (WRL)