vc编写com组件中使用连接点,供vb调用,代码如下:
---------------------------------------------------
HRESULT Fire_OnPos(BSTR bszSim,double dblX,double dblY,double dblSpeed,double dblDir,BSTR bszDate,BSTR bszTime)
{
CComVariant varResult;
DISPID dispid;
OLECHAR FAR* szMember = OLESTR("OnPos");
UINT uArgError;
EXCEPINFO excepInfo;

T* pT = static_cast<T*>(this);
int nConnectionIndex;
CComVariant* pvars = new CComVariant[7];
int nConnections = m_vec.GetSize();
HRESULT hRet;
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)
{
pDispatch->GetIDsOfNames(IID_NULL,&szMember,1,LOCALE_USER_DEFAULT,&dispid);
VariantClear(&varResult);
//VariantClear(&varResult2);
pvars[0].vt = VT_BSTR;
pvars[0].bstrVal = bszSim;
pvars[1].vt = VT_R8;
pvars[1].dblVal = dblX;
pvars[2].vt = VT_R8;
pvars[2].dblVal = dblY;
pvars[3].vt = VT_R8;
pvars[3].dblVal = dblSpeed;
pvars[4].vt = VT_R8;
pvars[4].dblVal = dblDir;
pvars[5].vt = VT_BSTR;
pvars[5].bstrVal = bszDate;
pvars[6].vt= VT_BSTR;
pvars[6].bstrVal = bszTime;
DISPPARAMS disp = { pvars, NULL, 7, 0 };
try
{
hRet = pDispatch->Invoke(dispid, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD, &disp, &varResult, &excepInfo, &uArgError);
//---------------------------------------
//在这里uArgError返回错误为5
//???????????????????
//---------------------------------------
if(hRet != S_OK)
{
// //
// hRet = GetLastError();
delete[] pvars;
return varResult.scode;
}
}
catch (COleException e) 
{
//
hRet = GetLastError();
delete[] pvars;
return varResult.scode;
}
}
}
delete[] pvars;
return varResult.scode;

}