Sdílet prostřednictvím


Postupy: Přímé vytváření instancí komponent knihovny WRL

Naučte se používat prostředí Windows Runtime knihovnu šablon jazyka C++ (WRL)Microsoft::WRL::Make a Microsoft::WRL::D etails::MakeAndInitialize funkcí k vytvoření instance komponenty z modulu, který ji definuje.

Pokud není zapotřebí používat továrny tříd nebo jiné mechanismy, je možné přímým vytvořením instance komponenty snížit režii. Komponentu můžete vytvořit přímo v aplikacích Univerzální platforma Windows i v desktopových aplikacích.

Informace o tom, jak pomocí prostředí Windows Runtime knihovny šablon jazyka C++ vytvořit klasickou komponentu MODELU COM a vytvořit instanci z externí desktopové aplikace, najdete v tématu Postupy: Vytvoření klasické komponenty modelu COM.

Tento dokument popisuje dva příklady. První příklad používá pro vytvoření instance komponenty funkci Make. V druhém příkladu se pro vytvoření instance komponenty, která může v průběhu vytváření selhat, používá funkce MakeAndInitialize. (Vzhledem k tomu, že com obvykle používá hodnoty HRESULT místo výjimek k označení chyb, typ COM obvykle nevyvolá z jeho konstruktoru. MakeAndInitialize umožňuje komponentě ověřit své stavební argumenty prostřednictvím RuntimeClassInitialize metody.) Oba příklady definují základní protokolovací rozhraní a implementují toto rozhraní definováním třídy, která zapisuje zprávy do konzoly.

Důležité

Operátor nelze použít new k vytvoření instance prostředí Windows Runtime komponent knihovny šablon jazyka C++. Proto je doporučeno pro přímé vytvoření instance komponenty vždy používat Make nebo MakeAndInitialize.

Vytvoření instance komponenty pro základní nástroj pro protokolování

  1. V sadě Visual Studio vytvořte projekt konzolové aplikace Win32. Projekt pojmenujte například WRLLogger.

  2. Do projektu přidejte soubor Midl File (.idl), pojmenujte ho ILogger.idla pak přidejte tento kód:

    import "ocidl.idl";
    
    // Prints text to the console.
    [uuid(AFDB9683-F18A-4B85-90D1-B6158DAFA46C)]
    interface ILogger : IUnknown
    {
        HRESULT Log([in] LPCWSTR text);
    }
    
  3. Pomocí následujícího kódu nahraďte obsah souboru 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.
    */
    

Zpracování chyby při vytváření komponenty základního nástroje pro protokolování

  1. Pro nahrazení definice třídy CConsoleWriter použijte následující kód. Tato verze obsahuje členskou proměnnou soukromého řetězce a přepisuje metodu RuntimeClass::RuntimeClassInitialize. RuntimeClassInitialize selže, pokud volání SHStrDup selže.

    // 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. Pro nahrazení definice wmain použijte následující kód. Tato verze používá MakeAndInitialize k vytvoření instance objektu CConsoleWriter a kontroluje výsledek 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.
    */
    

Viz také

Knihovna šablon C++ prostředí Windows Runtime (WRL)
Microsoft::WRL::Make
Microsoft::WRL::D etails::MakeAndInitialize