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;

功能实现了很简单的代码

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
说明文字在博客中。 摘录: 在学习的时候曾经百度了一下,想查找关于delphi中SafeArray的用法,没想到资料竟然如此之少,甚至连一篇相对完整的都没有。也许正如田师傅所说,现在高手们都在实行“技术封锁”了? 在CSDN技术中心有一篇关于C++的使用,说的比较详细。鉴于手中有田师傅的代码,特拿来一部分对照自己学习的,翻译为Delphi版本。留作笔记,日后翻阅。 =============================================================================== SAFEARRAY的主要目的是用于automation中的数组型参数的传递。因为在网络环境中,数组是不能直接传递的,而必须将其包装成SafeArray。实质上SafeArray就是将通常的数组增加一个描述符,说明其维数、长度、边界、元 素类型等信息。SafeArray也并不单独使用,而是将其再包装到VARIANT类型的变量中,然后才作为参数传送出去。在VARIANT的vt成员的 值如果包含VT_ARRAY|...,那么它所封装的就是一个SafeArray,它的parray成员即是指向SafeArray的指针。 SafeArray中元素的类型可以是VARIANT能封装的任何类型,包括VARIANT类型本身。 Delphicom组件或外部调用需要传递一个对象或者数组,这个时候可以考虑使用SafeArray。比如三层架构中通常需要将使用的ClientDataSet数据集传出,那么就可以将DataSet转换为SafeArray,再由其他模块转换接收。 ===============================================================================
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值