2010-03-12 77 views
0

我很新的,涉及組件對象模型什麼的,我想知道,如果管理調用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。組件不應該初始化公寓,線程應該。這絕對是一個破壞者。 – 2010-03-12 04:49:04

+0

該代碼不在DLL中。我不明白爲什麼我需要一個MTA ...... – 2010-03-12 16:10:19

回答

1

我不相信靜態存儲變量會在DLL卸載時被破壞,但是您不應該從dll中使用它。

我一般做類似的事情,但我不與靜態函數麻煩,我只是做了構造函數/析構函數公衆和刪除實例我的主要():

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

這是一個靜態庫(因此靜態庫在應用程序終止時被銷燬),它無法訪問WinMain。 「靜態變量」只是標準的C++單例模式。 – 2010-03-12 04:06:57

+0

這似乎是好的,儘管我對靜態的析構函數保持警惕,因爲你幾乎無法控制排序。不要依賴於其他靜態析構函數,比如單例COM對象,在它之前或之後運行。 – 2010-03-12 04:24:34

+0

在DLL中啓動線程已經很普遍了。所以想要選擇MTA。 – 2010-03-12 04:43:14

相關問題