• Delphi 开发so库,Delphi 调用SO库


    inux桌面系统:Deepin20

    一.编写SO库
    新建一个项目

    项目右键Add Linux Platform

    然后项目就变为.so

     添加代码

    library mySO;
     
    uses
      System.SysUtils,
      System.Classes;
     
    {$R *.res}
    function testStr: TStringList; cdecl;
    var
      str: string;
      strlist: TStringList;
    begin
      strlist := TStringList.Create;
      strlist.Add('hello');
      strlist.Add('world');
      result := strlist;
    end;
     
    function testInt(i: Integer): Integer; cdecl;
    begin
      Inc(i);
      result := i;
    end;
     
     
    exports
      testInt,
      testStr;
     
     
    begin
     
    end.

    编译,生成.so文件

     二.调用SO库
    新建项目

     右键Add Linux Platform,然后将so库添加到项目中

    添加代码

    unit Unit1;
     
    interface
     
    uses
      System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
      FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs,
      FMX.Controls.Presentation, FMX.StdCtrls,System.IOUtils, FMX.ScrollBox,
      FMX.Memo;
     
    type
      TForm1 = class(TForm)
        btn1: TButton;
        btn2: TButton;
        mmo1: TMemo;
        procedure btn1Click(Sender: TObject);
        procedure btn2Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;
     
     
     
    var
      Form1: TForm1;
     
      testInt:function (i: Integer): Integer;cdecl;
      testStr:function : TStringList;cdecl;
     
    implementation
     
    {$R *.fmx}
     
    procedure TForm1.btn1Click(Sender: TObject);
    var
      Handle1:NativeInt;
      i:integer;
      sl:TStringList;
    begin
      mmo1.Lines.Add(TPath.GetLibraryPath+'libmySO.so');
     
      Handle1:=LoadLibrary(PWideChar('libmySO.so'));
      mmo1.Lines.Add(IntToStr(Handle1));
      if Handle1<>0 then
      begin
        @testInt:=GetProcAddress(Handle1,'testInt');
        @testStr:=GetProcAddress(Handle1,'testStr');
     
        if Assigned(testInt) then
        begin
          i:=testInt(1000);
          mmo1.Lines.Add(IntToStr(i));
        end
        else
        begin
          mmo1.Lines.Add('nil');
        end;
     
        sl:=testStr;
        mmo1.Lines.AddStrings(sl);
     
        FreeLibrary(Handle1);
      end;
    end;
     
    procedure TForm1.btn2Click(Sender: TObject);
    begin
      Application.Terminate;
    end;
     
    end.
     F9 运行,结果如下

    源码下载https://download.csdn.net/download/zhanglu_king/20464265
    ————————————————
    版权声明:本文为CSDN博主「小米很好吃」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/zhanglu_king/article/details/119085973

  • 相关阅读:
    保姆级网络信任证书配置教程
    Set 与 Map 的使用
    结构型-代理模式
    Spring基础(五):Bean的生命周期
    VC++将资源文件编译进程序并在运行时释放到文件
    VS Code打造Rust的开发环境
    【文生图系列】Stable Diffusion原理篇
    Activiti工作流引擎中责任链模式的建立与应用原理
    ES6新特性详解
    PHP PDO
  • 原文地址:https://blog.csdn.net/tjsoft/article/details/133854797