Como instanciar componentes WRL diretamente
Aprenda 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 de módulo que o define.
Criando uma instância componentes diretamente, você pode reduzir a sobrecarga quando você não precisa 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 aplicativos desktop.
Para saber como usar para criar um componente básico de Tempo de Execução do Windows e para criar 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 uma instância de um aplicativo externo da á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 normalmente usa valores de HRESULT , em vez de exceções, para indicar erros, um tipo de COM normalmente não gera do construtor.MakeAndInitialize permite que um componente para validar seus argumentos de compilação com o método de RuntimeClassInitialize .) Dois exemplos definem uma interface e implementar básicos de registador qual interface definindo uma classe das mensagens que grava no console.
Importante |
---|
Você não pode usar o operador de new para criar uma instância de WRL componentes.Como consequência, é recomendável que você use sempre Make ou MakeAndInitialize para criar uma instância diretamente um componente. |
Para criar e criar uma instância de um componente básico de registador
No Visual Studio, crie um projeto de Aplicativo do Console Win32 .Nomeie o projeto, por exemplo, WRLLogger.
Adicione um arquivo de Arquivo Midl (.idl) ao projeto, qual o arquivo ILogger.idl, e em seguida 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); }
Use o seguinte código para substituir o conteúdo 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 manipular a falha de compilação para o componente básico de registador
Use o seguinte código para substituir a definição de classe de CConsoleWriter .Esta versão contém um variável de membro particular de cadeia de caracteres e substitui o método de RuntimeClass::RuntimeClassInitialize .RuntimeClassInitialize falhará se o parâmetro é fornecido 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() { } };
Use o seguinte código para substituir a definição de _tmain.Esta versão MakeAndInitialize usa para criar uma instância de CConsoleWriter dois objetos.Para demonstração, a primeira chamada êxito e a segunda chamada falha.
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. */
Consulte também
Referência
Microsoft::WRL::Details::MakeAndInitialize
Conceitos
Biblioteca de Modelos C++ do Tempo de Execução do Windows (WRL)