Compartilhar via


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.

Observação importanteImportante

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

  1. No Visual Studio, crie um projeto de Aplicativo do Console Win32 .Nomeie o projeto, por exemplo, WRLLogger.

  2. 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);
    }
    
  3. 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

  1. 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()
        {
        }
    };
    
  2. 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::Make

Microsoft::WRL::Details::MakeAndInitialize

Conceitos

Biblioteca de Modelos C++ do Tempo de Execução do Windows (WRL)