2010-03-12 2 views
0

Я очень новой к чему-либо с участием Component Object Model, и мне интересно, если этот метод управления звонками к CoInitalize/CoUninitalize имеет смысл:Является ли это хорошим способом управления инициализацией 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; 
} 

}} 

Тогда любой компонент, который необходим COM просто вызывает COM::Setup() и забывает об этом.

Имеет ли это смысл или я нарушаю любые «правила» COM?

+0

не может использовать его в DLL. Невозможно выбрать MTA. Компоненты никогда не должны инициализировать квартиру, потоки должны. Это определенно нарушитель правил. –

+0

Код не находится в DLL. Я не понимаю, почему мне когда-либо понадобился MTA ... –

ответ

1

Я не считаю, что статические переменные хранилища уничтожаются при выгрузке DLL, но вы не должны использовать это из DLL в любом случае.

я вообще что-то подобное, но я не заморачиваться с функцией статического, я просто сделать т е р/dtor общественности и перетащите экземпляр в моей основной():

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

Это статическая библиотека (поэтому статика уничтожается, когда приложение завершается), который не имеет доступа к WinMain. «Статическая переменная» - это всего лишь стандартный синглтон C++. –

+0

Кажется, это хорошо, хотя я опасаюсь деструкторов по статике, так как у вас мало контроля над порядком. Не следует зависеть от других статических деструкторов, например, от одиночных COM-объектов, работающих до или после него. –

+0

Запуск потока в DLL достаточно распространен. Так что хочется выбрать MTA. –

Смежные вопросы