静态调用简单,
动态调用麻烦。
静态调用占用资源多,
动态调用占用资源少。
正所谓鱼和熊掌不可兼得。

解决方案 »

  1.   


      显式例子:unit Main;interfaceuses
      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.