Delphi6与VC写的COM组件如何传递BYTE*类型数据

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, &params, &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;

功能实现了很简单的代码

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值