zoukankan      html  css  js  c++  java
  • 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;
    

      

  • 相关阅读:
    【如何在mysql 官网下载最新版本mysql 数据库】
    【17-类加载与反射】
    【16-网络编程】
    【14-输入/输出】
    【13-Annotation】
    【12-JDBC编程】
    C# SqlHelper类的数据库操作
    C# DateTime与时间戳转换
    C#递归方法遍历目录及子目录
    C# SaveFileDialog的用法
  • 原文地址:https://www.cnblogs.com/wuxi15/p/14815777.html
Copyright © 2011-2022 走看看