谨以此文记录我的ATL COM组件的学习之路--多线程情况下,连接点的使用方法。

首先非常感谢下面几篇文章:

http://groups.yahoo.com/neo/groups/wtl/conversations/topics/16493

http://lang.9sssd.com/awtl/art/480

http://www.codewiz51.com/wiki/ATL-Threading-passing-a-SAFEARRAY-when-raising-an-event.ashx(包含例子下载地址:)



准备工作:

首先你得为你的组件添加了连接点事件。需要修改的文件包括:

(1) TaskManagerCOM_ATL.idl

添加如下代码:

importlib("stdole2.tlb");
	[
		uuid(BABA3626-072D-4411-B054-4661EB09847B),
		helpstring("_ITaskManagerEvents Interface")
	]
	dispinterface _ITaskManagerEvents
	{
		properties:
		methods:
		[id(1),helpstring("method sendMessage_to_Client")] HRESULT sendMessage_to_Client(
			[in] int message_id,
			[in] BSTR file_name,
			[in] int m_process);
		
	};


(2)在类视图中,编译你的  _ITaskManagerEvents ,添加模板库。


(2)在类视图中利用向导为该该组件的 添加  ”连接点实现“
这里应该为     "_ITaskManagerEvents"



(4)步骤4,这是你会发现你的 头文件中多了一个   _ITaskManagerEvents_CP.h,同时在你的组件类上添加了

public CProxy_ITaskManagerEvents<CTaskManager>,

public IConnectionPointContainerImpl<CTaskManager>,

COM_INTERFACE_ENTRY_IMPL(IConnectionPointContainer)等代码。


前面的这几个步骤就是向导给我目前提供的代码,在实现完前面的步骤后,你会发现你的COM组件的主线程调用,已经可以调用_ITaskManagerEvents_CP.h中的Fire_sendMessage_to_Client(你的函数可能有所不同)函数了。 当前面的步骤没有什么问题后,接下来就是修改几个点以是它能在多线程环境里面运行的步骤。

 

下面是实现的步骤: 

(1)将ATLCPImplMT.h复制到你的项目文件当中。

(2)修改 _ITaskManagerEvents_CP.h中的

template<class T>    
class CProxy_IXXXEvents :     
	public IConnectionPointImpl<T, &__uuidof(_IXXXEvents)> 

template<class T>
class CProxy_ITaskManagerEvents :public IConnectionPointImplMT<T, &__uuidof(_ITaskManagerEvents)>


修改:

		pThis->Lock();
		CComPtr<IUnknown> punkConnection = m_vec.GetAt(iConnection);
		pThis->Unlock();
		IDispatch * pConnection = static_cast<IDispatch *>(punkConnection.p);


		CComPtr<IUnknown> punkConnection;
		punkConnection.Attach (GetInterfaceAt(iConnection));
		CComQIPtr<IDispatch> pConnection(punkConnection);

(3)在你的调用线程中,记着要在线程开始和结束时初始化和卸载com库,调用CoInitializeEx(NULL, COINIT_MULTITHREADED);和CoUninitialize();函数;现在可以在其他线程中调用触发函数Fire_XXX函数了!



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值