2010-03-12 41 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

相关问题