CComObjectRootEx::FinalConstruct
Vous pouvez substituer cette méthode dans votre classe dérivée pour effectuer toute initialisation requise pour votre objet.
HRESULT FinalConstruct( );
Valeur de retour
S_OK de retour en cas de réussite ou l'une des valeurs d' HRESULT d'erreur standard.
Notes
Par défaut, CComObjectRootEx::FinalConstruct retourne simplement S_OK.
Il y a des avantages à effectuer l'initialisation de FinalConstruct plutôt que le constructeur de votre classe :
Vous ne pouvez pas retourner un code d'état d'un constructeur, mais vous pouvez retourner HRESULT au moyen de valeur de retour d'FinalConstruct. Lorsque les objets de votre classe sont créés à l'aide de la fabrique de classe standard fournie par ATL, cette valeur de retour est retournée au client COM en vous permettant de leur fournir des informations détaillées sur l'erreur.
Vous ne pouvez pas appeler les fonctions virtuelles via le mécanisme de fonction virtuelle du constructeur d'une classe. Appeler une fonction virtuelle du constructeur d'une classe entraîne un appel résolu statiquement à la fonction telle qu'elle est défini à ce stade de la hiérarchie d'héritage. Les appels aux fonctions virtuelles pures entraînent des erreurs d'éditeur de liens.
Votre classe n'est pas la classe la plus dérivée dans la hiérarchie d'héritage — il s'appuie sur une classe dérivée fournie par ATL pour fournir une partie de ses fonctionnalités. Il existe de fortes chances que l'initialisation devra utiliser les fonctionnalités fournies par cette classe (c'est certainement remplie lorsque les objets de votre classe doit regrouper d'autres objets), mais le constructeur de votre classe n'a aucun moyen d'accéder à ces fonctionnalités. Le code de construction pour votre classe est exécuté avant la classe la plus dérivée est entièrement construit.
Toutefois, FinalConstruct est appelé juste après la classe la plus dérivée est entièrement construite vous permettant aux fonctions virtuelles d'appel et utilise l'implémentation de décompte de références fournie par ATL.
Exemple
En général, substituez cette méthode dans la classe dérivée d' CComObjectRootEx pour créer tous les objets regroupés en agrégats. Par exemple :
class ATL_NO_VTABLE CMyAggObject :
public CComObjectRootEx<CComSingleThreadModel>,
public CComCoClass<CMyAggObject, &CLSID_MyAggObject>,
public IDispatchImpl<IMyAggObject, &IID_IMyAggObject, &LIBID_NVC_ATL_COMLib, /*wMajor =*/ 1, /*wMinor =*/ 0>
{
public:
DECLARE_GET_CONTROLLING_UNKNOWN()
HRESULT FinalConstruct()
{
return CoCreateInstance(CLSID_MyCustomClass, GetControllingUnknown(),
CLSCTX_ALL, IID_IUnknown, (void**)&m_pMyCustomClass);
}
IMyCustomClass* m_pMyCustomClass;
// Remainder of class declaration omitted.
Si la construction échoue, vous pouvez retourner une erreur. Vous pouvez également utiliser la macro DECLARE_PROTECT_FINAL_CONSTRUCT pour protéger votre objet externe d'être supprimé si, lors de la création, l'objet regroupé en agrégats interne incrémente le décompte de références ensuite décrémente le décompte à 0.
Voici une manière classique pour créer un agrégat :
Ajoutez un pointeur d' IUnknown à votre objet de classe et initialisez-le à NULL dans le constructeur.
Substituez FinalConstruct pour créer l'agrégat.
Utilisez le pointeur d' IUnknown que vous avez défini comme paramètre à la macro de COM_INTERFACE_ENTRY_AGGREGATE .
Substitution FinalRelease pour libérer le pointeur d' IUnknown .
Configuration requise
Header: atlcom.h