Udostępnij za pośrednictwem


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

Dowiedz się, jak używać Biblioteka szablonów C++ środowiska wykonawczego systemu Windows (WRL) Microsoft::WRL::Make i Microsoft::WRL::Details::MakeAndInitialize funkcje tworzenia wystąpienia składnika z modułu, który definiuje ją.

Utworzenie wystąpienia składników bezpośrednio, można zmniejszyć narzuty Jeśli nie ma potrzeby fabryk klas lub innych mechanizmów.Można utworzyć wystąpienie składnika bezpośrednio w obu Windows Store aplikacji w aplikacji pulpitu.

Aby dowiedzieć się, jak używać WRL do utworzenia podstawowego Środowisko wykonawcze systemu Windows składnika i utworzenie jej instancji z zewnętrzne Windows Store aplikacji, zobacz Wskazówki: tworzenie podstawowego składnika środowiska wykonawczego systemu Windows za pomocą biblioteki WRL.Aby dowiedzieć się, jak używać WRL Aby utworzyć składnika klasycznego modelu COM i utworzenie jej instancji z zewnętrznych aplikacji pulpitu, zobacz Porady: tworzenie klasycznego składnika COM za pomocą biblioteki WRL.

Ten dokument zawiera dwa przykłady.W pierwszym przykładzie użyto Make funkcja tworzenia wystąpienia składnika.W drugim przykładzie użyto MakeAndInitialize funkcja tworzenia wystąpienia składnika, który może się nie powieść podczas budowy. (Ponieważ korzysta zwykle COM HRESULT wartości, a nie wyjątki do sygnalizowania błędów, typ COM zazwyczaj nie rzucać z jego konstruktora.MakeAndInitializeWłącza składnik, aby sprawdzić poprawność budowy argumenty za pośrednictwem RuntimeClassInitialize metoda.) Zarówno przykłady Definiowanie interfejsu rejestratora podstawowe i wdrożenie tego interfejsu poprzez zdefiniowanie klasy, która zapisuje komunikaty konsoli.

Ważna uwagaWażne

Nie można użyć new operatora do utworzenia wystąpienia WRL składników.Dlatego zaleca się aby zawsze używać Make lub MakeAndInitialize bezpośrednio tworzenia wystąpienia składnika.

Aby utworzyć i Utwórz wystąpienie składnika podstawowe rejestratora

  1. W programie Visual Studio, tworzenie Win32 Console Application projektu.Nazwa projektu, na przykład, WRLLogger.

  2. Dodaj Plik regionów (.idl) plik do projektu, do pliku o nazwie ILogger.idl, a następnie dodać ten 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żyć następującego kodu, aby zastąpić zawartość 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.
    */
    

Do obsługi awarii konstrukcji składnika podstawowe rejestratora

  1. Użyj następującego kodu, aby zamienić definicja CConsoleWriter klasy.Ta wersja posiada Członek ciąg prywatnej zmiennej i przesłonięcia RuntimeClass::RuntimeClassInitialize metody.RuntimeClassInitializenie działa, jeśli wywołanie SHStrDup nie powiedzie się.

    // 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ć definicja wmain.Ta wersja wykorzystuje MakeAndInitialize do utworzenia wystąpienia CConsoleWriter obiektu i kontroli HRESULT wynik.

    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ż

Informacje

Microsoft::WRL::Make

Microsoft::WRL::Details::MakeAndInitialize

Koncepcje

Biblioteka szablonów języka C++ środowiska wykonawczego systemu Windows (WRL)