我做了一个简单的DLL,如下:
library DLL;
uses
SysUtils,
Classes;
{$R *.res}
var n:integer=0;
function add():integer;stdcall;
begin
n:=n+2;
result:=n;
end;
exports
add;
begin
end.
调用的程序如下:
unit Unit1;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;type
TForm1 = class(TForm)
...
end; TAdd= function():integer;var
Form1: TForm1; HInst:THandle;
FPointer:TFarProc;implementation{$R *.dfm}procedure TForm1.FormCreate(Sender: TObject);
begin
HInst:=LoadLibrary('Dll.dll');
FPointer:=GetProcAddress(HInst,'add');
end;
procedure TForm1.Button1Click(Sender: TObject);begin
showmessage(inttostr(TAdd(FPointer)));
end;
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
FreeLibrary(lhnd);
end;end.一点问题都没有,但是
我稍微改了一下DLL如下:
library DLL;uses
SysUtils,
Classes;{$R *.res}
var n:integer=0;
function add(step:integer):integer;stdcall;
begin
n:=n+step;
result:=n;
end;
exports
add;
begin
end.
再调用,如下:
unit Unit1;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;type
TForm1 = class(TForm)
...
end; TAdd= function(step:integer):integer;var
Form1: TForm1; HInst:THandle;
FPointer:TFarProc;implementation{$R *.dfm}procedure TForm1.FormCreate(Sender: TObject);
begin
HInst:=LoadLibrary('Dll.dll');
FPointer:=GetProcAddress(HInst,'add');
end;
procedure TForm1.Button1Click(Sender: TObject);begin
showmessage(inttostr(TAdd(FPointer)(5)));
end;
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
FreeLibrary(lhnd);
end;end.
就出内存地址的错误,请各位一定要帮我解决问题呀,很着急,谢谢大家了!
library DLL;
uses
SysUtils,
Classes;
{$R *.res}
var n:integer=0;
function add():integer;stdcall;
begin
n:=n+2;
result:=n;
end;
exports
add;
begin
end.
调用的程序如下:
unit Unit1;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;type
TForm1 = class(TForm)
...
end; TAdd= function():integer;var
Form1: TForm1; HInst:THandle;
FPointer:TFarProc;implementation{$R *.dfm}procedure TForm1.FormCreate(Sender: TObject);
begin
HInst:=LoadLibrary('Dll.dll');
FPointer:=GetProcAddress(HInst,'add');
end;
procedure TForm1.Button1Click(Sender: TObject);begin
showmessage(inttostr(TAdd(FPointer)));
end;
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
FreeLibrary(lhnd);
end;end.一点问题都没有,但是
我稍微改了一下DLL如下:
library DLL;uses
SysUtils,
Classes;{$R *.res}
var n:integer=0;
function add(step:integer):integer;stdcall;
begin
n:=n+step;
result:=n;
end;
exports
add;
begin
end.
再调用,如下:
unit Unit1;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;type
TForm1 = class(TForm)
...
end; TAdd= function(step:integer):integer;var
Form1: TForm1; HInst:THandle;
FPointer:TFarProc;implementation{$R *.dfm}procedure TForm1.FormCreate(Sender: TObject);
begin
HInst:=LoadLibrary('Dll.dll');
FPointer:=GetProcAddress(HInst,'add');
end;
procedure TForm1.Button1Click(Sender: TObject);begin
showmessage(inttostr(TAdd(FPointer)(5)));
end;
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
FreeLibrary(lhnd);
end;end.
就出内存地址的错误,请各位一定要帮我解决问题呀,很着急,谢谢大家了!
Form1: TForm1;
HInst:THandle; FPointer:TFarProc;
修改如下:
FPointer:TAdd
我找到毛病了,是因为我调用的时候的问题,应该把以前的
TAdd= function(step:integer):integer;
改成
TAdd= function(step:integer):integer;stdcall;
就好用了,不过说实话,我不明白stdcall;深层次的意思,请告诉我呀