Comment : instancier directement les composants WRL

Découvrez comment utiliser la bibliothèque de modèles C++ Windows Runtime (WRL)Microsoft ::WRL ::Make et Microsoft ::WRL ::D etails ::MakeAndInitialize pour instancier un composant du module qui le définit.

En instanciant directement des composants, vous pouvez réduire la surcharge lorsque vous n’avez pas besoin de fabriques de classes ou d’autres mécanismes. Vous pouvez instancier un composant directement dans les applications plateforme Windows universelle et dans les applications de bureau.

Pour savoir comment utiliser la bibliothèque de modèles C++ Windows Runtime pour créer un composant COM classique et l’instancier à partir d’une application de bureau externe, consultez Comment : créer un composant COM classique.

Ce document présente deux exemples. Le premier exemple utilise la Make fonction pour instancier un composant. Le deuxième exemple utilise la MakeAndInitialize fonction pour instancier un composant qui peut échouer pendant la construction. (Étant donné que COM utilise généralement des valeurs HRESULT, au lieu d’exceptions, pour indiquer des erreurs, un type COM ne lève généralement pas de son constructeur. MakeAndInitialize permet à un composant de valider ses arguments de construction par le biais de la RuntimeClassInitialize méthode.) Ces deux exemples définissent une interface d’enregistreur d’événements de base et implémentent cette interface en définissant une classe qui écrit des messages dans la console.

Important

Vous ne pouvez pas utiliser l’opérateur pour instancier les composants de la new bibliothèque de modèles C++ Windows Runtime. Par conséquent, nous vous recommandons d’utiliser Make MakeAndInitialize ou d’instancier un composant directement.

Pour créer et instancier un composant enregistreur d’événements de base

  1. Dans Visual Studio, créez un projet d’application console Win32. Nommez le projet, par exemple WRLLogger.

  2. Ajoutez un fichier Midl File (.idl) au projet, nommez le fichier ILogger.idl, puis ajoutez ce code :

    import "ocidl.idl";
    
    // Prints text to the console.
    [uuid(AFDB9683-F18A-4B85-90D1-B6158DAFA46C)]
    interface ILogger : IUnknown
    {
        HRESULT Log([in] LPCWSTR text);
    }
    
  3. Utilisez le code suivant pour remplacer le contenu de 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.
    */
    

Pour gérer l’échec de construction pour le composant enregistreur d’événements de base

  1. Utilisez le code suivant pour remplacer la définition de la CConsoleWriter classe. Cette version contient une variable membre de chaîne privée et remplace la RuntimeClass::RuntimeClassInitialize méthode. RuntimeClassInitialize échoue si l’appel échoue SHStrDup .

    // 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. Utilisez le code suivant pour remplacer la définition de wmain. Cette version utilise MakeAndInitialize pour instancier l’objet CConsoleWriter et vérifier le résultat 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.
    */
    

Voir aussi

Bibliothèque de modèles C++ Windows Runtime (WRL)
Microsoft ::WRL ::Make
Microsoft ::WRL ::D etails ::MakeAndInitialize