admin管理员组

文章数量:1593942


根本原因是在创建“ATL简单对象“时,线程模型默认选择的是“单元”。导致子线程异步调用到主线程函数时,报错“E_UNEXPECTED Catastrophic failure.”


修改方案:

   将ATL简单对象的线程模型属性设置为“自由”,具体操作如下:


1. 修改 Ukey.rgs 线程模型声明内存模型为“自由”

Ukey.rgs


			InprocServer32 = s '%MODULE%'
			{
				val ThreadingModel = s '<span style="color:#FF0000;">Free</span>'
			}			

2. 修改Ukey.h 类声明多线程支持

class ATL_NO_VTABLE CUkey :	
	<span style="color:#FF0000;">public CComObjectRootEx<CComMultiThreadModel></span>,
	public CComCoClass<CUkey, &CLSID_Ukey>,
	public IDispatchImpl<IUkey, &IID_IUkey, &LIBID_ahdmsUkeyLib, /*wMajor =*/ 1, /*wMinor =*/ 0>,	
	public IObjectSafetyImpl<CUkey,INTERFACESAFE_FOR_UNTRUSTED_CALLER>
{

保存,重新编译项目。多线程异步调用正常。

本文标签: 报错多线程ATLCatastrophicEUNEXPECTED