一个奇怪的问题,关于dll,我不懂,大家教我.(50分)

  • 主题发起人 主题发起人 Yves
  • 开始时间 开始时间
Y

Yves

Unregistered / Unconfirmed
GUEST, unregistred user!
一个奇怪的问题,关于dll,我不懂,大家教我.
我前几天,看了篇文章,是关于用delphi调用vc写的dll的,
整个程序是比较3个数的大小,选出其中最大和最小的,
delphi负责界面的事情,界面上有三个文本框,输入欲比较的3个数,另有两个文本框输出比较结果,一个按钮是开始比较
源程序如下
unit main;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TTestVcDLLForm = class(TForm)
GroupBox1: TGroupBox;
edtInt1: TEdit;
edtInt2: TEdit;
edtInt3: TEdit;
GroupBox2: TGroupBox;
edtMax: TEdit;
edtMin: TEdit;
btnRun: TButton;//上边就是这些界面控件
procedure btnRunClick(Sender: TObject);//这个是那个button
private
{ Private declarations }
public

{ Public declarations }
end;

var
TestVcDLLForm: TTestVcDLLForm;

implementation
uses maxmin
//接口单元,内容见后

{$R *.dfm}



procedure TTestVcDLLForm.btnRunClick(Sender: TObject);
begin
edtMax.Text:=IntToStr(Max1(StrToInt(edtInt1.Text),
StrToInt(edtInt2.Text),StrToInt(edtInt3.Text)))
//调用动态链接库中的函数Max1
edtMin.Text:=IntToStr(Min1(StrToInt(edtInt1.Text),
StrToInt(edtInt2.Text),StrToInt(edtInt3.Text)))
//调用动态链接库中的函数Min1
end;
end.

//下面是接口单元

unit maxmin;

interface
function Min1(x,y,z:Integer):Integer
stdcall

function Max1(x,y,z:Integer):Integer
stdcall


implementation
function Min1;external 'MaxMin.DLL' name 'Min1';
function Max1;external 'MaxMin.DLL' name 'Max1'

end.

vc写的dll就不列出了,就是求三个数中的一个大数,一个小数

按照这样运行,很正常,特好,但是
我给改了一下就不正常了:
我把函数声明也就是:
function Min1(x,y,z:Integer):Integer
stdcall

function Max1(x,y,z:Integer):Integer
stdcall


放到了类TTestVcDLLForm的public里


function Min1;external 'MaxMin.DLL' name 'Min1';
function Max1;external 'MaxMin.DLL' name 'Max1'

放到了
implementation
后面
并且废弃了对maxmin的引用

改成了:

unit main;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TTestVcDLLForm = class(TForm)
GroupBox1: TGroupBox;
edtInt1: TEdit;
edtInt2: TEdit;
edtInt3: TEdit;
GroupBox2: TGroupBox;
edtMax: TEdit;
edtMin: TEdit;
btnRun: TButton;
procedure btnRunClick(Sender: TObject);
private
{ Private declarations }
public //这里
function Min1(x,y,z:Integer):Integer
stdcall;
function Max1(x,y,z:Integer):Integer
stdcall


{ Public declarations }
end;

var
TestVcDLLForm: TTestVcDLLForm;

implementation

//uses maxmin
这里
{$R *.dfm}
//和这里
function TTestVcDLLForm.Min1;external 'MaxMin.DLL' name 'Min1';
function TTestVcDLLForm.Max1;external 'MaxMin.DLL' name 'Max1';


procedure TTestVcDLLForm.btnRunClick(Sender: TObject);
begin
edtMax.Text:=IntToStr(Max1(StrToInt(edtInt1.Text),
StrToInt(edtInt2.Text),StrToInt(edtInt3.Text)))
//调用动态链接库中的函数Max1
edtMin.Text:=IntToStr(Min1(StrToInt(edtInt1.Text),
StrToInt(edtInt2.Text),StrToInt(edtInt3.Text)))
//调用动态链接库中的函数Min1
end;
end.

然后运行程序就不行,输出的最小值是正确的,但最大值不对,而且不管输入什么数,输出的最大值就是一个固定的数(特离谱的一个数)

为什么呢,大家教我!




 
大家试一试,看看是不是我说的这样,
我用的是delphi7
 
dll中输出的是标准函数,而你主程序中定义的是类方法,调用当然不会对(类方法被调用时会传入比你定义的参数个数多一个)。
 
o,对了,有个this指针,那怎么能让这个程序正确呢?
是不是,我在dll中多传一个参数就行了,但这个this指针是在所有原来的参数之前还是之后呢?
 
我回去试了一下,在vc的dll函数里,在参数列表的第一个位置加了一个void*,就能得正常结果了,不过这个函数也就不知道自己是谁了,怎么让它知道呢?
 
一般把 dll 的函数还是扔到类的外面,而在类里可以另外写方法去调用啊。
而且 dll 一般看做库函数,使用公共单元比较多吧。
 
哦,这样呀,我再去想一下
谢谢
 
一人一半,谢谢两位大虾,呵呵
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
806
import
I
I
回复
0
查看
763
import
I
I
回复
0
查看
687
import
I
后退
顶部