Condividi tramite


Procedura: creare direttamente un'istanza dei componenti WRL

Informazioni su come usare la libreria di modelli C++ di Windows Runtime (WRL)Microsoft::WRL::Make e Microsoft::WRL::D etails::MakeAndInitialize per creare un'istanza di un componente dal modulo che lo definisce.

Creando direttamente un'istanza dei componenti, è possibile ridurre il sovraccarico quando non sono necessarie class factory o altri meccanismi. È possibile creare un'istanza di un componente direttamente nelle app piattaforma UWP (Universal Windows Platform) e nelle app desktop.

Per informazioni su come usare la libreria di modelli C++ di Windows Runtime per creare un componente COM classico e crearne un'istanza da un'app desktop esterna, vedere Procedura: Creare un componente COM classico.

Questo documento illustra due esempi. Il primo esempio usa la Make funzione per creare un'istanza di un componente. Il secondo esempio usa la MakeAndInitialize funzione per creare un'istanza di un componente che può non riuscire durante la costruzione. Poiché COM usa in genere valori HRESULT, anziché eccezioni, per indicare errori, un tipo COM in genere non genera un'eccezione dal relativo costruttore. MakeAndInitialize consente a un componente di convalidare gli argomenti di costruzione tramite il RuntimeClassInitialize metodo . Entrambi gli esempi definiscono un'interfaccia logger di base e implementano tale interfaccia definendo una classe che scrive messaggi nella console.

Importante

Non è possibile usare l'operatore per creare un'istanza new dei componenti della libreria di modelli C++ di Windows Runtime. Pertanto, è consigliabile usare Make sempre o MakeAndInitialize per creare un'istanza diretta di un componente.

Per creare e creare un'istanza di un componente logger di base

  1. In Visual Studio creare un progetto applicazione console Win32. Denominare il progetto, ad esempio WRLLogger.

  2. Aggiungere un file Midl File (con estensione idl) al progetto, denominare il file ILogger.idle quindi aggiungere questo codice:

    import "ocidl.idl";
    
    // Prints text to the console.
    [uuid(AFDB9683-F18A-4B85-90D1-B6158DAFA46C)]
    interface ILogger : IUnknown
    {
        HRESULT Log([in] LPCWSTR text);
    }
    
  3. Usare il codice seguente per sostituire il contenuto di 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.
    */
    

Per gestire gli errori di costruzione per il componente logger di base

  1. Usare il codice seguente per sostituire la definizione della CConsoleWriter classe . Questa versione contiene una variabile membro di stringa privata ed esegue l'override del RuntimeClass::RuntimeClassInitialize metodo . RuntimeClassInitialize ha esito negativo se la chiamata a SHStrDup non riesce.

    // 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. Usare il codice seguente per sostituire la definizione di wmain. Questa versione usa MakeAndInitialize per creare un'istanza dell'oggetto CConsoleWriter e controlla il risultato 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.
    */
    

Vedi anche

Libreria modelli C++ per Windows Runtime
Microsoft::WRL::Make
Microsoft::WRL::D etails::MakeAndInitialize