必须在创建的对象内初始化COM(进程外)



我创建了一个Windows NT服务,它使用ATL(out-of-proc COM)导出COM接口,我在对象的类的Ctor()中调用CoInitializeEx(0,COINIT_MULTITHREADED),在Dtor()调用CoUninitialize()

阅读时尚应用程序设计师同意:自由线程模式是今年秋天的热门,并用公寓线程模式推动基于ActiveX的网页,这并没有澄清。

我的ATL项目已声明:

#定义_ATL_FREE_THREADED

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

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

最新更新