调用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;