COM Connection point pass UDT as parameters

 最近需要用到COM中的Connection Point来传送UDT, 查找了一些文章,终于在codeproject上发现2001年的文章,他的例子传的是一个自定义结构体数组,在后面的评论中有一段传自定义结构的例子,代码如下

 

HRESULT Fire_NewMyStruct( MyStruct myStruct)
	{
		HRESULT hr = S_OK;
		T * pThis = static_cast<T *>(this);
		int cConnections = m_vec.GetSize();
 
		if( cConnections == 0 )
		{
			return S_FALSE;
		}
 
		//IRecordInfo code:
		IRecordInfo *pMyStructRec = NULL;
		hr = ::GetRecordInfoFromGuids( LIBID_MyStructControlLib, 1, 0, 0, MyStruct_IID, &pMyStructRec ); 
 
		for (int iConnection = 0; iConnection < cConnections; iConnection++)
		{
			pThis->Lock();
			CComPtr<IUnknown> punkConnection = m_vec.GetAt(iConnection);
			pThis->Unlock();
 
			IDispatch * pConnection = static_cast<IDispatch *>(punkConnection.p);
 
			if (pConnection)
			{
				CComVariant avarParams[1];
				PVOID pdata = NULL;
				pdata = GlobalAlloc(GMEM_FIXED, sizeof(MyStruct));
				memcpy_s(pdata, sizeof(MyStruct), &myStruct, sizeof(MyStruct));
				avarParams[0].pvRecord = pdata;
				avarParams[0].pRecInfo = pMyStructRec;
				avarParams[0].vt = VT_RECORD;
				DISPPARAMS params = { avarParams, NULL, 1, 0 };
				hr = pConnection->Invoke(6, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD, ¶ms, NULL, NULL, NULL);
			}
		}
		pMyStructRec = NULL; // don't release this
                return hr;
	}


看到MSDN上也有类似的例子,大同小异。经过测试,在C++客户端可以接受到自定义结构体/结构体数组,而在C#客户端无法接到事件通知,并且调试时hr = pConnection->Invoke(...)返回 E_NOTIMPL,我想可能是COM在C#中自动完成的代码有问题。具体原因希望知道的高手指点。

另外我们通过让自定义结构体继承IUnknown,也就是一个接口啦,然后把这个接口当作参数传给Connection Point,这种方法在C#和C++中都可以获得通知。如果个人来用的话,只要管理好这个接口的生命周期,实际上不会出什么问题的,但是如果作为组件发布给客户用,你无法规定客户如何编写他们的代码。由于传递的是接口,那么在同一时间就只有一个实例,就存在造成接口内部数据的混乱的危险,所以不可取。

继续跟进中,希望COM高手指点指点。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值