2010-03-12 2 views
0

Je suis très nouveau pour tout ce qui concerne Component Object Model, et je me demande si cette méthode de gestion des appels à CoInitalize/CoUninitalize sens:Est-ce un bon moyen de gérer les initialisations de COM?

COM.hpp:

#pragma once 

namespace WindowsAPI { namespace ComponentObjectModel { 

class COM 
{ 
    COM(); 
    ~COM(); 
public: 
    static void Setup(); 
}; 

}} 

COM.cpp :

#include <Windows.h> 
#include "COM.hpp" 

namespace WindowsAPI { namespace ComponentObjectModel { 

COM::COM() 
{ 
    if (CoInitializeEx(NULL, COINIT_APARTMENTTHREADED) != S_OK) throw std::runtime_error("Couldn't start COM!"); 
} 

COM::~COM() 
{ 
    CoUninitialize(); 
} 

void COM::Setup() 
{ 
    static COM instance; 
} 

}} 

Ensuite, tout composant qui a besoin COM appelle simplement COM::Setup() et oublie à ce sujet. Est-ce que cela a du sens ou est-ce que je brise des "règles" de COM?

+0

Ne peut pas l'utiliser dans une DLL. Impossible de sélectionner MTA. Les composants ne devraient jamais initialiser un appartement, les threads devraient l'être. C'est définitivement un briseur de règles. –

+0

Le code n'est pas dans une DLL. Je ne vois pas pourquoi j'aurais besoin d'un MTA ... –

Répondre

1

Je ne crois pas que les variables de stockage statiques soient détruites lors du déchargement de dll, mais vous ne devriez pas l'utiliser à partir d'une DLL de toute façon.

je fais en général quelque chose de similaire, mais je ne vous embêtez pas avec une fonction statique, je viens de faire le cteur/dtor public et laisse tomber une instance dans ma main():

int WINAPI wWinMain(...) { 
    Com::ComInit comInitGuard; 
    ... 
+0

Il s'agit d'une bibliothèque statique (donc les statistiques sont détruites lorsque l'application se termine) qui n'a pas accès à WinMain. La "variable statique" est juste le modèle singleton standard C++. –

+0

Cela semble bien alors, bien que je me méfie des destructeurs sur la statique, puisque vous avez peu de contrôle sur la commande. Ne dépendez pas d'autres destructeurs statiques, par exemple des objets COM singleton, qui s'exécutent avant ou après. –

+0

Démarrer un thread dans une DLL est assez commun. Donc, vouloir sélectionner MTA. –

Questions connexes