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的相互转化。不过不要担心,笔者已经完美解决了这个问题,并且在项目中使用了。详见下面的代码段:
[delphi] view plain copy
/// <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;  

相关阅读 >>

Delphi tstrings 过滤空行

Delphi中clientdataset的用法小结

Delphi dbgrideh footer的设置和使用

Delphi获取 斐波那契数列 的函数

Delphi xe2 idhttp 获取utf-8编码中文网页

Delphi enablecontrols,disablecontrols函数

Delphi链接自己的主页和邮件

Delphi 连接 ssl tls 1.2

Delphi 实现打开文件定位

Delphi 去字符串长度函数 strlen,length

更多相关阅读请进入《Delphi》频道 >>



打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...