必须在创建的对象中初始化COM(out-of-proc)吗?

时间:2012-03-10 12:39:39

标签: multithreading com initialization atl

我创建了一个Windows NT服务,它使用ATL(进程外COM)导出COM接口,我在Ctor()中执行API调用CoInitializeEx(0,COINIT_MULTITHREADED),在Dtor()中执行CoUninitialize()我的对象类的一类?

阅读Fashionable App Designers Agree: The Free Threading Model is What's Hot This FallGive ActiveX-based Web Pages a Boost with the Apartment Threading Model没有做任何澄清。

我的ATL项目声明:

#define _ATL_FREE_THREADED

1 个答案:

答案 0 :(得分:1)

对于已经由CAtlExeModuleT构造函数处理的进程外ATL服务器。它将在其构造函数中调用InitializeCom()。当你#defined _ATL_FREE_THREADED时,它会自动产生对CoInitializeEx(NULL,COINIT_MULTITHREADED)的调用,正如你所期望的那样。代码很容易在vc / atlmfc / include / atlbase.h

中找到

接口方法调用将由RPC线程从存根进行,实际调用的线程完全不可预测。非常危险,因为RPC回收线程,并且调用通常由同一个线程进行。但并非总是如此,具体取决于正在处理的并发呼叫数量。支持免费线程的负担是确保您的代码完全是线程安全的。如果你遇到了死锁或线程竞争类型的任何错误,或者依赖于在多个调用中具有线程关联性的同步对象(如Mutex),那么在服务器负载很重之前它们不会毁了你的一天。一定要测试一下。