Partager via


Comment : instancier directement les composants WRL

Apprenez comment utiliser Bibliothèque de modèles Windows Runtime C++ (WRL) Microsoft::WRL::Make et les fonctions Microsoft::WRL::Details::MakeAndInitialize pour instancier un composant du module qui le définit.

En instanciant des composants directement, réduisez la charge mémoire lorsque vous n'avez pas besoin de fabriques de classes ou d'autres mécanismes. Instanciez un composant directement dans les deux applications Windows Store et dans les applications de bureau.

Pour apprendre à utiliser WRL pour créer un composant de base Windows Runtime et l'instancier d'une application externe Windows Store, consultez Procédure pas à pas : création d'un composant Windows Runtime de base à l'aide de WRL. Pour apprendre à utiliser WRL pour créer un composant de base COM et l'instancier d'une application externe , consultez Comment : créer un composant COM classique à l'aide de WRL.

Ce document affiche deux exemples. Le premier exemple utilise la fonction Make pour instancier un composant. Le deuxième exemple utilise la fonction MakeAndInitialize pour instancier un composant qui peut échouer pendant la construction. (Comme COM utilise généralement des valeurs HRESULT, au lieu des exceptions, pour afficher les erreurs, un type COM en général ne lève pas de constructeur. MakeAndInitialize permet à un composant de valider ses arguments de construction via la méthode RuntimeClassInitialize .) Les deux exemples définissent une interface de journal 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 new pour instancier des composants WRL.Par conséquent, il est recommandé d'utiliser systématiquement Make ou MakeAndInitialize pour instancier un composant directement.

Pour créer et instancier un composant de base du journal

  1. Dans Visual Studio, créez un projet Win32 Application Console. Nommez le projet, par exemple, WRLLogger.

  2. Ajoutez un fichier Fichier Midl (.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 "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.
    */
    

Pour gérer l'échec de construction pour le composant de base du journal

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

    // 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 la classe wmain. Cette version utilise MakeAndInitialize pour instancier l'objet CConsoleWriter et active le résultat de 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

Référence

Microsoft::WRL::Make

Microsoft::WRL::Details::MakeAndInitialize

Concepts

Bibliothèque de modèles Windows Runtime C++ (WRL)