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
Dans Visual Studio, créez un projet d’application console Win32. Nommez le projet, par exemple WRLLogger.
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); }
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
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 laRuntimeClass::RuntimeClassInitialize
méthode.RuntimeClassInitialize
échoue si l’appel échoueSHStrDup
.// 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); } };
Utilisez le code suivant pour remplacer la définition de
wmain
. Cette version utiliseMakeAndInitialize
pour instancier l’objetCConsoleWriter
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