[Delphi] pSafeArray与TBytes类型转换

   虽然Delphi有这自己独特的语言优势,但是跟其他语言加解密互通时,处理显得尤为麻烦。比如3DES加解密,网上下载的一些加解密方法加密的字符使用java无法解密,或者java加密的文本,无法用D解密。

   无奈之下使用其他语言封装加解密部分,再用D来调用。前一篇博客中说到的是使用c++封装dll的方式,但是有非常大的问题,加密串的长度有限制,且使用静态数组分配内存,占用了不少的内存空间。经过多次调整改用动态数组失败后,决定改用C#封装dll的方式来加解密。

   将C#封装的DLL注册未COM组件,外部参数定义为:

//加密

  function GetDes3EncryptedText_Ex(const key: WideString; const data: WideString): PSafeArray; safecall;

//解密

  function GetDes3EncryptedText(key: PSafeArray; data: PSafeArray): PSafeArray; safecall;

麻烦来了,在Delphi中使用的时候需要实现PSafeArray与TBytes的相互转化。不过不要担心,笔者已经完美解决了这个问题,并且在项目中使用了。详见下面的代码段:

/// <summary>
    /// 将TBytes转为pSafeArray
    /// </summary>
function ArrayToSafeArray(DataArray: TBytes): PSafeArray;
var
  Bound: TSafeArrayBound;
  psa: PSafeArray;
  i, ret: Integer;
begin
  Bound.cElements := Length(DataArray);
  Bound.lLbound := 0;
  psa := SafeArrayCreate(VT_UI1, 1, PSafeArrayBound(@Bound));
  for i := Low(DataArray) to High(DataArray) do
  begin
    ret := SafeArrayPutElement(psa, &i, &DataArray[i]);
  end;
  Result := psa;
end;

/// <summary>
    /// 将pSafeArray转为TBytes
    /// <param name="pArray">源pSafeArray</param>
    /// <param name="ABytes">目标TBytes</param>
    /// </summary>
    function SafeArrayToBytes(pArray: PSafeArray; out ABytes: TBytes): Boolean;
var
  RVarData: TVarData;
  RBound: TVarArrayBound;
  j, UCount: Integer;
  aValue: Byte;
begin
  VarResultCheck((SafeArrayGetLBound(pArray, 1, RBound.LowBound)));
  VarResultCheck(SafeArrayGetUBound(pArray, 1, UCount));
  RBound.ElementCount := UCount - RBound.LowBound;
  SetLength(ABytes, RBound.ElementCount+2);
  for j := RBound.LowBound to RBound.ElementCount do
  begin
    VarResultCheck(SafeArrayGetElement(pArray, j, aValue));
    ABytes[j] := aValue;
  end;


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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值