Поделиться через


Практическое руководство. Непосредственное создание экземпляра компонентов WRL

Дополнительные сведения об использовании Библиотека шаблонов C++ среды выполнения Windows (WRL) Microsoft::WRL::Make и функцию Microsoft::WRL::Details::MakeAndInitialize, чтобы создать компонент из модуля, в котором он определен.

С помощью создания компонентов напрямую, можно уменьшить нагрузку, когда нет необходимости использовать фабрики класса или другие механизмы.Можно создать компонент непосредственно в обоих приложениях Магазина Windows и классических в приложениях.

Чтобы получить сведения о том, как использовать для создания базового компонент Среда выполнения Windows и создать его из внешнего приложения Магазина Windows см. в разделе Пошаговое руководство. Создание базового компонента среды выполнения Windows с использованием WRL.Чтобы получить сведения о том, как использовать WRL для создания классического компонент модели COM и создать его из внешнего классического приложения см. в разделе Практическое руководство. Создание классического компонента COM с помощью WRL.

В следующем примере показан документ 2.В первом примере используется функция Make для создания компонента.Во втором примере используется функция MakeAndInitialize для создания компонента, который может вылтить сбоя во время построения.(Поскольку модели COM обычно используются значения HRESULT вместо исключений, чтобы показать ошибки, модели COM тип обычно не создает из его конструктора.компонент MakeAndInitialize позволяет проверить ее аргументы построения с помощью метода RuntimeClassInitialize). Оба примера определяют базовый интерфейс ведения журнала, реализующие этот интерфейс, определение класса, который записывает сообщения на консоль.

Важное примечаниеВажно

Нельзя использовать оператор new создается компоненты WRL.Поэтому рекомендуется всегда используется Make или MakeAndInitialize, чтобы создать компонент напрямую.

Создание и создать базовый компонент средства ведения журнала

  1. В Visual Studio создайте проект Консольное приложение Win32.Имя проекта, например WRLLogger.

  2. Добавьте в проект файл Midl файл (.idl) присвойте файлу имя ILogger.idl, а затем добавьте следующий код:

    import "ocidl.idl";
    
    // Prints text to the console.
    [uuid(AFDB9683-F18A-4B85-90D1-B6158DAFA46C)]
    interface ILogger : IUnknown
    {
        HRESULT Log([in] BSTR text);
    }
    
  3. Используйте следующий код, чтобы заменить содержимое 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.
    */
    

Обработать сбой построения для базового компонента ведения журнала

  1. Используйте следующий код, чтобы заменить определение класса CConsoleWriter.Эта версия содержит закрытый переменную-член строки и переопределяет метод RuntimeClass::RuntimeClassInitialize.RuntimeClassInitialize не выполняется, если используется параметр 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. Используйте следующий код, чтобы заменить определение _tmain.Эта версия использует MakeAndInitialize для создания экземпляра объекта CConsoleWriter 2.Для демонстрации первый вызов завершается успешно, а второй вызов завершится ошибкой.

    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.
    */
    

См. также

Ссылки

Microsoft::WRL::Make

Microsoft::WRL::Details::MakeAndInitialize

Основные понятия

Библиотека шаблонов C++ среды выполнения Windows (WRL)