读书人

小弟我是个新手问个简单而又奇怪的有

发布时间: 2012-03-20 14:01:11 作者: rapoo

我是个新手,问个简单而又奇怪的问题。盼望各位前来顶帖,解答ing...............................................
我写了一个简单的dll 里面就一个函数 计算1个数的的2倍。
dll程序如下:
dpr文件:

Delphi(Pascal) code
library MyDLL;uses  SysUtils,  Classes,  Base in 'Base.pas';{$R *.res}exports    Doubl;beginend.

Base.pas文件:
Delphi(Pascal) code
unit Base;interface  function Doubl(N:integer):integer;stdcall;implementation  function Doubl(N:integer):integer;stdcall;  begin      Result:=N*2;  end;end.

测试程序很简单,就是在窗体的按钮事件里面调用Dll的方法:
代码如下:
Delphi(Pascal) code
unit Unit1;interfaceuses  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,  Dialogs, StdCtrls;type  TDoubl = function(N:integer):integer;  TForm1 = class(TForm)    Button1: TButton;    procedure Button1Click(Sender: TObject);  private    { Private declarations }  public    { Public declarations }  end;var  Form1: TForm1;implementation{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);varorde:integer;Moudel:THandle;pfuc:TFarProc;begin  Moudel := Loadlibrary('MyDLL.dll');  if Moudel > 32 then  begin    pfuc := GetProcAddress(Moudel,'Doubl');    orde := TDoubl(pfuc)(4);    showmessage(IntToStr(orde));  end;  FreeLibrary(Moudel);end;end.

现在dll可以正常加载和卸载,但是函数调用结果不对。传入的是4,返回是:2486504(好像是函数的入口地址,不清楚了)。然后就出现异常。
实在不明白为什么,使望各位高手指点迷经。

[解决办法]
TDouble= function Doubl(N:integer):integer;stdcall;
var
orde:integer;
Moudel:THandle;
pfuc:TDoubl;
begin
Moudel := Loadlibrary('MyDLL.dll');
if Moudel > 32 then
begin
@pfuc := GetProcAddress(Moudel,'Doubl');
orde := pfuc(4);
showmessage(IntToStr(orde));
end;
FreeLibrary(Moudel);
end;
这样试试。
[解决办法]
TDoubl(pfuc)(4)的结合顺序可能不对,所以返回TDoubl的地址
最好分开写
type
TDoubl = function(N:integer):integer;stdcall;
...
procedure TForm1.Button1Click(Sender: TObject);
var
orde:integer;
Moudel:THandle;
Tp:TFarProc;
pfuc:TDoubl;
begin
Moudel := Loadlibrary('MyDLL.dll');
if Moudel > 32 then
begin
Tp := GetProcAddress(Moudel,Pchar('Doubl'));
pfuc := TDoubl(Tp);//可以和上一句合并为pfuc := TDoubl(GetProcAddress(Moudel,Pchar('Doubl')));
orde:=pfuc(4);
showmessage(IntToStr(orde));
end;
FreeLibrary(Moudel);
end;

读书人网 >.NET

热点推荐