如何:直接執行個體化 WRL 元件

 

如需 Visual Studio 2017 的最新文件請參閱 Visual Studio 2017 文件

了解如何使用 Windows 執行階段 C++ 範本庫(WRL)Microsoft::WRL::MakeMicrosoft::WRL::Details::MakeAndInitialize這兩隻函式,從定義元件的模組中具現化元件。

您可以直接具現化元件,在您不需要 Class Factory 或其他機制時來減少額外負荷。 您可以在 Windows 8.x 市集 應用程式與傳統型應用程式中直接具現化元件。

若要了解如何使用 WRL 建立基本 Windows 執行階段 元件,以及從外部 Windows 8.x 市集 應用程式具現化,請參閱 逐步解說:建立基本 Windows 執行階段元件。 若要了解如何使用 WRL 建立典型COM 元件,以及從外部傳統型應用程式具現化,請參閱 如何:建立傳統 COM 元件

這個文件顯示兩個範例。 第一個範例會使用 Make 函式產生元件。 第二個範例會使用 MakeAndInitialize 函式具現化在建構期間可能會失敗的元件。(由於 COM 一般會使用 HRESULT 值取代例外狀況來表示錯誤, COM 型別通常不會從它的建構函式擲回。 MakeAndInitialize 可讓元件透過 RuntimeClassInitialize 方法驗證其建構函式引數)。以上兩個範例皆會定義基本記錄器介面,並藉由定義會寫入訊息至主控台的類別實作該介面。

System_CAPS_ICON_important.jpg 重要

您不能使用 new 運算子執行個體化 WRL 元件。 因此,建議您一律使用 MakeMakeAndInitialize 直接產生元件。

建立及初始化基本記錄器元件

  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] LPCWSTR text);
    }
    

  3. 以下列程式碼取代 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.
    */
    

處理基本記錄器元件的建構失敗

  1. 以下列程式碼取代 CConsoleWriter 類別的定義。 此版本保留私用字串成員變數並覆寫 RuntimeClass::RuntimeClassInitialize 方法。 如果對 SHStrDup 的呼叫失敗,RuntimeClassInitialize 會失敗。

    // 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);
        }
    };
    

  2. wmain 的定義替換成下列程式碼。 這個版本使用 MakeAndInitialize 具現化 CConsoleWriter 物件並檢查 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.
    */
    

Windows Runtime C++ Template Library (WRL)
Microsoft::WRL::Make
Microsoft::WRL::Details::MakeAndInitialize

顯示: