Porady: bezpośrednie tworzenie wystąpień składników biblioteki WRL

Dowiedz się, jak używać biblioteki szablonów języka środowisko wykonawcze systemu Windows C++ (WRL)Microsoft::WRL::Make i Microsoft::WRL::D etails::MakeAndInitialize, aby utworzyć wystąpienie składnika z modułu, który go definiuje.

Bezpośrednie utworzenie wystąpienia składników może zmniejszyć obciążenia, jeśli nie ma potrzeby tworzenia fabryk klas lub innych mechanizmów. Składnik można utworzyć bezpośrednio w aplikacjach platforma uniwersalna systemu Windows i w aplikacjach klasycznych.

Aby dowiedzieć się, jak za pomocą biblioteki szablonów języka środowisko wykonawcze systemu Windows C++ utworzyć klasyczny składnik COM i utworzyć wystąpienie go z poziomu zewnętrznej aplikacji klasycznej, zobacz How to: Create a Classic COM Component (Instrukcje: tworzenie klasycznego składnika COM).

Ten dokument zawiera dwa przykłady. W pierwszym przykładzie użyto funkcji Make do utworzenia wystąpienia składnika. W drugim przykładzie użyto funkcji MakeAndInitialize do utworzenia wystąpienia składnika, które może się nie powieść podczas kompilacji. (Ponieważ com zazwyczaj używa wartości HRESULT, zamiast wyjątków, aby wskazać błędy, typ COM zwykle nie zgłasza się z konstruktora. MakeAndInitialize umożliwia składnikowi weryfikowanie argumentów konstrukcyjnych za pomocą RuntimeClassInitialize metody . Oba przykłady definiują podstawowy interfejs rejestratora i implementują ten interfejs, definiując klasę, która zapisuje komunikaty w konsoli.

Ważne

Nie można użyć new operatora do utworzenia wystąpienia składników biblioteki szablonów języka C++ środowisko wykonawcze systemu Windows. Dlatego zaleca się, aby zawsze używać Make lub MakeAndInitialize do bezpośredniego utworzenia składnika.

Aby stworzyć i utworzyć instancję podstawowego składnika modułu logującego.

  1. W programie Visual Studio utwórz projekt aplikacji konsolowej Win32. Nadaj projektowi nazwę, na przykład WRLLogger.

  2. Dodaj plik Midl File (idl) do projektu, nadaj plikowi ILogger.idlnazwę , a następnie dodaj następujący kod:

    import "ocidl.idl";
    
    // Prints text to the console.
    [uuid(AFDB9683-F18A-4B85-90D1-B6158DAFA46C)]
    interface ILogger : IUnknown
    {
        HRESULT Log([in] LPCWSTR text);
    }
    
  3. Użyj następującego kodu, aby zastąpić zawartość pliku WRLLogger.cpp.

    #include "pch.h" // Use stdafx.h in Visual Studio 2017 and earlier
    #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.
    */
    

Aby obsłużyć awarię konstruktora podstawowego składnika modułu logującego

  1. Użyj następującego kodu, aby zamienić definicję klasy CConsoleWriter. Ta wersja posiada prywatną zmienną typu string i nadpisuje metodę RuntimeClass::RuntimeClassInitialize. RuntimeClassInitialize kończy się niepowodzeniem, jeśli wywołanie zakończy się SHStrDup niepowodzeniem.

    // 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. Użyj następującego kodu, aby zamienić definicję wmain. Ta wersja służy MakeAndInitialize do tworzenia wystąpienia CConsoleWriter obiektu i sprawdzania wyniku 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.
    */
    

Zobacz też

Biblioteka szablonów języka C++ środowiska uruchomieniowego systemu Windows (WRL)
Microsoft::WRL::Make
Microsoft::WRL::D etails::MakeAndInitialize