佚名通过本文主要向大家介绍了com接口定义,主板com接口定义,usb转com接口驱动,com接口,com扩展接口等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com
问题: 关于在COM的事件接口中自定义结构的传递问题
描述:
GetXXXX和OnClientChanged的函数参数类型都是CLIENT_INFO*
GetXXXX函数调用正常,
但事件接口中的OnClientChanged函数中使用CLIENT_INFO*时碰到几个问题:
1, 以下代码是MFC自动为事件接口对象生成的代码,但在编译的时候,编译器警告说会把avarParams[0] = pclient;强制转为BOOL型
2. 我把代码改为如下: avarParams[0] = (BYTE*)pclient; 编译没有警告了,但在客户端被传递过去的只是一个字节
请问我该如何修改才能把CLIENT_INFO的完整结构传递过去?
解决方案1:
描述:
我定义了一个COM接口IXManageInfoBase,并有对应的事件接口DXManageInfoBaseEvents
interface IXManageInfoBase : IUnknown{
typedef struct _CLIENT_INFO{
DWORD dwIpAddr;
USHORT usPort;
[string] wchar_t* pwszMAC;
[string] wchar_t* pwszComputerName;
}CLIENT_INFO;
[, helpstring("method GetXXXX")] HRESULT GetXXXX([in] CLIENT_INFO* pClient);
};
library sdcsrvmLib
{
......
dispinterface DXManageInfoBaseEvents
{
properties:
methods:
[id(1), helpstring("method OnClientChanged")] HRESULT OnClientChanged([in] CLIENT_INFO* pclient);
};
.......
coclass XManageInfoBase
{
[default] interface IXManageInfoBase;
[default, source] dispinterface DXManageInfoBaseEvents;
};
};
GetXXXX和OnClientChanged的函数参数类型都是CLIENT_INFO*
GetXXXX函数调用正常,
但事件接口中的OnClientChanged函数中使用CLIENT_INFO*时碰到几个问题:
1, 以下代码是MFC自动为事件接口对象生成的代码,但在编译的时候,编译器警告说会把avarParams[0] = pclient;强制转为BOOL型
2. 我把代码改为如下: avarParams[0] = (BYTE*)pclient; 编译没有警告了,但在客户端被传递过去的只是一个字节
请问我该如何修改才能把CLIENT_INFO的完整结构传递过去?
#pragma once
template<class T>
class CProxyDXManageInfoBaseEvents :
public IConnectionPointImpl<T, &__uuidof(DXManageInfoBaseEvents)>
{
public:
HRESULT Fire_OnClientChanged( SDC_EVENT_ACTION sea, SDC_CLIENT_INFO * pclient)
{
HRESULT hr = S_OK;
T * pThis = static_cast<T *>(this);
int cConnections = m_vec.GetSize();
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[2];
avarParams[1] = sea;
avarParams[0] = pclient;
CComVariant varResult;
DISPPARAMS params = { avarParams, NULL, 2, 0 };
hr = pConnection->Invoke(1, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD, ¶ms, &varResult, NULL, NULL);
}
}
return hr;
}
};
解决方案1:
CLIENT_INFO最好是IDispatch接口的派生类, 举例:
class CLIENT_INFO : public IDispatch
{
};
传递时,
CLIENT_INFO ci;
VARIANT var;
var.vt = VT_DISPATCH;
var.pdispVal= &ci;
接口定义:
[id(1), helpstring("method OnClientChanged")] HRESULT OnClientChanged([in] VARIANT* pclient);
用非标准的COM接口作参数只能产生未遇料到的错误 .
问题在avarParams[0] = pclient;这句,可以跟踪看看如果编译通过,构造出来的VARIANT是哪种变量类型。
由于你传递的指针是用户类型指针,当连接点客户端被调用时,VARIANT参数没有正确地转换成你需要的指针类型,后果是难以预料的。