864
社区成员




如下是我有用ATL开发COM组件给C#调用些的一个PositionChanged事件,但是C#调用Run方法是触发不了Fire_PostionChanged事件是怎么回事,请看下代码哪里有错。
//idl文件片段
library MyServerLib
{
importlib("stdole2.tlb");
[
uuid(bb398ee4-645b-47bf-a76a-8d3d1bb57f68)
]
coclass CompReg
{
[default] interface IComponentRegistrar;
};
[
uuid(95ba3e51-3b63-4662-b1ee-472dd0534cd5)
]
dispinterface _IDPositionEvents
{
properties:
methods:
[id(20)] HRESULT PositionChanged( [in] VARIANT vtArrayIndex[9],[in] VARIANT vtArrayValues[9]);
}
}
//激发函数
HRESULT Fire_PositionChanged( VARIANT vtArrayIndex[9], VARIANT vtArrayValues[9])//事件激发函数
{
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[18];
for (int i = 0; i < 9; i++)
{
avarParams[i].lVal = vtArrayIndex[i].lVal;
avarParams[i].vt = VT_I4;
}
for (int i = 9; i < 18; i++)
{
avarParams[i].lVal = vtArrayValues[i - 9].lVal;
avarParams[i].vt = VT_I4;
}
CComVariant varResult;
DISPPARAMS params = { avarParams, NULL, 18, 0 };
hr = pConnection->Invoke(20, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD, ¶ms, &varResult, NULL, NULL);
}
}
return hr;
}
//触发激发函数
STDMETHODIMP CDPosition::Run(SHORT* pRetsult)
{
// TODO: 在此处添加实现代码
*pRetsult = 0;
CComVariant a[9];
int var1 = 10;
for (int i = 0; i < 9; i++)
{
a[i].vt = VT_I4;
a[i].lVal = var1;
var1++;
}
CComVariant b[9];
int var = 100;
for (int i = 0; i < 9; i++)
{
b[i].vt = VT_I4;
b[i].lVal = var;
var++;
}
for(int i=0; i<2; i++)
{
this->Fire_PositionChanged( a, b);
Sleep(2000);
}
return S_OK;
}