Delphi 调用DLL TStream作为参数

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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;

  

 

以上是关于Delphi 调用DLL TStream作为参数的主要内容,如果未能解决你的问题,请参考以下文章

c#调用Delphi DLL参数为结构体数组

关于delphi调用C++的DLL中char*参数的问题

从 C# 调用非托管 DLL,将结构作为参数传递

你好,请教一个问题,delphi如何调用DLL中的一个带动态数组参数的方法?

要从 Delphi 调用的 C++ dll 函数 - 数组参数

Delphi XE3写DLL,用Delphi7调用,报错!