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 日期字符串转换日期格式

Delphi real控件 rm格式的播放器

Delphi 快速选择文件夹路径

Delphi使用edge browser浏览器组件

Delphi ini 文件操作记要: 使用 tmeminifile

Delphi tstreamreader 和tstreamwriter

Delphi dcc64.exe Delphi64位命令行编译器揭秘

Delphi 安卓app在线升级

Delphi 获取系统服务service id

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



打赏

取消

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

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

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

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

评论

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