飘云阁

 找回密码
 加入我们

QQ登录

只需一步,快速开始

查看: 4473|回复: 1

DELPHI中动态调用dll

[复制链接]
  • TA的每日心情
    开心
    2019-9-19 16:05
  • 签到天数: 4 天

    [LV.2]偶尔看看I

    发表于 2007-2-8 09:48:50 | 显示全部楼层 |阅读模式
    显式例子:



    unit Main;



    interface



    uses

      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

      Dialogs, StdCtrls, ExtCtrls, Grids, DBGrids, DB, DBTables, DBCtrls;



    type

      TForm1 = class(TForm)

        Button1: TButton;

        Edit1: TEdit;

        Edit2: TEdit;

        Image1: TImage;

        DataSource1: TDataSource;

        Table1: TTable;

        Table1SpeciesNo: TFloatField;

        Table1Category: TStringField;

        Table1Common_Name: TStringField;

        Table1SpeciesName: TStringField;

        Table1Lengthcm: TFloatField;

        Table1Length_In: TFloatField;

        Table1Notes: TMemoField;

        Table1Graphic: TGraphicField;

        DBGrid1: TDBGrid;

        procedure Button1Click(Sender: TObject);

      private

        { Private declarations }

      public

        { Public declarations }

      end;



    //  function GetInteger(I:Integer): Integer;stdcall;external 'DLLOne.dll';

    //  function GetDouble(F:Double): Double;stdcall;external 'DLLOne.dll';



      TGetDouble = function (F:Double): Double; stdcall;



    var

      Form1: TForm1;



    implementation



    {$R *.dfm}



    procedure TForm1.Button1Click(Sender: TObject);

    var D: Double;

        DLLHandle: THandle;

        Func: TGetDouble;

    begin

      Image1.Picture.Assign(Table1Graphic);

      Table1Graphic.Assign(Image1.Picture);

      Exit;

      DLLHandle := LoadLibrary('DLLOne.dll');

      try

      @Func := GetProcAddress(DLLHandle, 'GetDouble');



      //Edit1.Text := IntToStr(GetInteger(2));

      //D := GetDouble(2.2);

      if Assigned(@Func) then

      begin

        D := Func(2.2);

        Edit2.Text := FloatToStr(D);

      end;



      finally

      FreeLibrary(DLLHandle);

      end;

    end;



    end.



    隐式例子:



    library DLLOne;



    uses

      SysUtils,

      Classes;



    {$R *.res}



      function GetDoubleExt(F:Double): Double;stdcall;external 'DLLTwo.dll';

      function GetInt(I:Integer): Integer;stdcall;external 'DLLTwo.dll';



      function GetInteger(I:Integer): Integer;stdcall;

      begin

        Result := GetInt(I);

      end;



      function GetDouble(D:Double): Double;stdcall;

      begin

        Result := GetDoubleExt(D);

      end;



    exports

      GetInteger,

      GetDouble;



    begin

    end.















    library DLLTwo;



    { Important note about DLL memory management: ShareMem must be the

      first unit in your library's USES clause AND your project's (select

      Project-View Source) USES clause if your DLL exports any procedures or

      functions that pass strings as parameters or function results. This

      applies to all strings passed to and from your DLL--even those that

      are nested in records and classes. ShareMem is the interface unit to

      the BORLNDMM.DLL shared memory manager, which must be deployed along

      with your DLL. To avoid using BORLNDMM.DLL, pass string information

      using PChar or ShortString parameters. }



    uses

      SysUtils,

      Classes;



    {$R *.res}

      function GetDoubleExt(D:Double):Double ;stdcall;

      begin

        Result := D;

      end;

      function GetInt(I:Integer): Integer;stdcall;

      begin

        Result := I;

      end;



    exports

      GetDoubleExt,

      GetInt;



    begin

    end.

    评分

    参与人数 1威望 +8 收起 理由
    wyh1983 + 8 支持原创

    查看全部评分

    PYG19周年生日快乐!

    该用户从未签到

    发表于 2007-4-7 17:06:48 | 显示全部楼层
    感谢楼主的分享!
    PYG19周年生日快乐!
    您需要登录后才可以回帖 登录 | 加入我们

    本版积分规则

    快速回复 返回顶部 返回列表