Delphi6如何调用COM组件实现连接点的问题参照上一篇文章
今天刚刚又有了点收获赶紧写下来
Delphi6中通过SafeArray来与VC写的COM组件进行通讯。
vc端:
连接点_IDispConnectEvents增加一个方法相当于在Delphi6端增加一个事件
id(3), helpstring("method Result3")] HRESULT Result3([in] VARIANT vrData);
方法的代码如下:
HRESULT Fire_Result3( VARIANT vrData)
{
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[1];
avarParams[0] = vrData;
CComVariant varResult;
DISPPARAMS params = { avarParams, NULL, 1, 0 };
hr = pConnection->Invoke(3, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD, ¶ms, &varResult, NULL, NULL);
}
}
return hr;
}
调用_IDispConnectEvents上述方法的IDispConnect组件的方法代码如下:
STDMETHODIMP CDispConnect::Add2(LONG n1, LONG n2)
{
VARIANT vt;
LONG lrst = n1 + n2;
BYTE b[16] = {1,2,3,4,5,6,7,8,9,0,11,12,13,14,15,0};
VariantInit(&vt);
SAFEARRAY *psa = NULL;
SAFEARRAYBOUND rgsabound[1];
rgsabound[0].lLbound = 0;
rgsabound[0].cElements = 10;
psa = SafeArrayCreate(VT_UI1,1,rgsabound);
for(long i = 0; i < 10; i++)
{
SafeArrayPutElement(psa,&i,&b[i]);
}
vt.vt = VT_ARRAY | VT_UI1;
vt.parray = psa;
Fire_Result3(vt);
SafeArrayDestroy(psa);
psa = NULL;
VariantClear(&vt);
return S_OK;
}
Delphi6端
procedure TForm1.DispConnect1Result3(Sender: TObject; vrData: OleVariant);
var
i : integer;
s : string;
begin
if VarIsNull(vrData) then
i := -1
else if VarIsArray(vrData) then
begin
// i := VarArrayHighBound(vrData, 1) + 1;
s := '';
for i := VarArrayLowBound(vrData,1) to VarArrayHighBound(vrData,1) do
begin
s := s + IntToHex(vrData[i],2); //vrData每个数据就是我们上面b数组的内容
end;
end;
ShowMessage(s);
end;
功能实现了很简单的代码