DLL函数不适合返回 string 类型,应该用缓冲区,下面是用整数作例子:
/// unit1.pasunit Unit1;interface
function a(s:Integer):Integer; stdcall;implementationfunction a(s:Integer):Integer;
begin
    result:=s;
end;end./// project1.dpr
library Project1;uses
  SysUtils,
  Classes,
  Unit1 in 'Unit1.pas';{$R *.res}exports a;beginend.

解决方案 »

  1. 简单的dll,dll中只有一个max函数,返回2个数中的大数
    1、New->DLL;取名为DLL_0001,编写代码:
    library dll_0001;
    uses
       SysUtils,
       Classes;
    {$R *.RES}
    function max(x,y:integer):integer;stdcall;
    begin
         if(x>y) then
          max :=x
          else
          max :=y;
    end;
    exports max;
    begin
    end.2、Delphl调用dll
    调用dll分动态调用和静态调用2中,动态调用写起来简单,安全点,动态调用复杂很多,但很灵活;
    (1)new一个Application,在Form中放入2个TEdit、1个TLabek;
    (2)静态调用
    unit Unit1;
    interface
    uses
       Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
       StdCtrls;
    type
       TForm1 = class(TForm)
         Edit1: TEdit;
         Edit2: TEdit;
         Label1: TLabel;
         procedure Edit2KeyDown(Sender: TObject; var Key: Word;
           Shift: TShiftState);
       private
         { Private declarations }
       public
         { Public declarations }
       end;
    var
       Form1: TForm1;
    implementation
    {$R *.DFM}
    function max(x,y:integer):integer;stdcall;
    external 'dll_0001.dll';
    procedure TForm1.Edit2KeyDown(Sender: TObject; var Key: Word;
       Shift: TShiftState);
    begin
    if key =vk_return then
    label1.Caption :=IntToStr(max(StrToInt(Edit1.text),StrToInt(edit2.text)));
    end;
    end.
    (3)动态调用
    unit Unit1;
    interface
    uses
       Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
       StdCtrls;
    type
       TForm1 = class(TForm)
         Edit1: TEdit;
         Edit2: TEdit;
         Label1: TLabel;
         procedure Edit2KeyDown(Sender: TObject; var Key: Word;
           Shift: TShiftState);
       private
         { Private declarations }
       public
         { Public declarations }
       end;
    var
       Form1: TForm1;
    implementation
    {$R *.DFM}
    procedure TForm1.Edit2KeyDown(Sender: TObject; var Key: Word;
       Shift: TShiftState);
    type
    TFunc =function(x,y:integer):integer;stdcall;
    var
    Th:Thandle;
    Tf:TFunc;
    Tp:TFarProc;
    begin
    if key =vk_return then
    begin
    Th :=LoadLibrary('dll_0001.dll');    {load dll}
    if(Th   >0) then
    try
    Tp :=GetProcAddress(Th,PChar('max'));
    if(Tp <>nil) then
    begin         { begin 1}
    Tf :=TFunc(Tp);
    Label1.Caption :=IntToStr(
    Tf(StrToInt(Edit1.text),StrToInt(Edit2.text)));
    end   { end 1}
    else
       ShowMessage('function max not found.');
    finally
    FreeLibrary(Th);
    end
    else
    ShowMessage('dll_0001.dll not exsit.');end;
    end;
    end.
      

  2. 去看一下万一的博客吧
    http://www.cnblogs.com/del/category/113550.html
      

类似问题 »