Delphi 调用DLL TStream作为参数

调用DLL里的函数,不同版本的RTL间不可以将TStream作为参数,也就是说Delphi调用不同版本的Delphi 编写的DLL不可以将TStream作为参数。但是用IStream接口可以。

用IStream接口,必须用到两个类,TStreamAdapter和TOleStream。

调用TStreamAdapter.Create将TStream对象转换成IStream接口,然后传给DLL,DLL里再调用TOleStream.Create(const Stream: IStream),将IStream转换成TStream对象。

如果需要返回TStream对象,则再将TStream对象转成IStream,Exe接收后再将IStream转换成TStream即可。

笔者将图片传给DLL解压后,保存成文件发现错误。最终发现需要再将TOleStream转换成TMemoryStream对象。这样就可以保存了。

转换成TMemoryStream只需建立一个TMemoryStream对象,再调用CopyFrom函数。

使用TStreamAdapter和TOleStream需引用ActiveX,vcl.AxCtrls单元。

目前我的做法是用Delphi 10.4.2创建DLL,d7调用DLL里的函数对数据进行压缩,必竟现在d7方面的东西太少了。不得不用高版本的

参考代码如下

function ZSTD_CompressionStream(Data:TStream):TStream;
var
  IData,IData2:IStream;
 begin
  Data.Position:=0;
  IData:=TStreamAdapter.Create(Data);
  IData2:=ZSTDCompressionStream(IData);//调用DLL里的函数,参数类型是iStream,返回也是IStream
  Result:=TOleStream.Create(IData2);
  Result.Position:=0;
 end;

  

原文地址:https://www.cnblogs.com/wuxi15/p/14815777.html