COM的连接点的Fire事件如何传出SAFEARRAY * * Message参数

王朝vc·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

SAFEARRAY * *类型比较复杂,不像其他类型可以直接传入Fire事件方法里。

先看基本类型参数处理方法: 举例LONG型

HRESULT Fire_CloseCompleted(LONG MethodID)

{

CComVariant varResult;

T* pT = static_cast<T*>(this);

int nConnectionIndex;

CComVariant* pvars = new CComVariant[1];

int nConnections = m_vec.GetSize();

for (nConnectionIndex = 0; nConnectionIndex < nConnections; nConnectionIndex++)

{

pT->Lock();

CComPtr<IUnknown> sp = m_vec.GetAt(nConnectionIndex);

pT->Unlock();

IDispatch* pDispatch = reinterpret_cast<IDispatch*>(sp.p);

if (pDispatch != NULL)

{

VariantClear(&varResult);

pvars[0] = MethodID;

DISPPARAMS disp = { pvars, NULL, 1, 0 };

pDispatch->Invoke(0x60010003, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD, &disp, &varResult, NULL, NULL);

}

}

delete[] pvars;

return varResult.scode;

}

蓝色字体是与参数相关语句。

再看SAFEARRAY * *类型的处理方法:

HRESULT Fire_MessageReceived(SAFEARRAY * * Message)

{

CComVariant varResult;

T* pT = static_cast<T*>(this);

int nConnectionIndex;

CComVariant* pvars = new CComVariant[1];

int nConnections = m_vec.GetSize();

for (nConnectionIndex = 0; nConnectionIndex < nConnections; nConnectionIndex++)

{

pT->Lock();

CComPtr<IUnknown> sp = m_vec.GetAt(nConnectionIndex);

pT->Unlock();

IDispatch* pDispatch = reinterpret_cast<IDispatch*>(sp.p);

if (pDispatch != NULL)

{

VariantClear(&varResult);

pvars[0].vt = VT_ARRAY | VT_BYREF | VT_UI1; //参数类型

pvars[0].pparray = Message; //参数值

DISPPARAMS disp = { pvars, NULL, 1, 0 };

pDispatch->Invoke(0x60010008, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD, &disp, &varResult, NULL, NULL);

}

}

delete[] pvars;

return varResult.scode;

}

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
 
© 2005- 王朝網路 版權所有 導航