关于DLL的问题(50分)

  • 主题发起人 主题发起人 hqpeng
  • 开始时间 开始时间
H

hqpeng

Unregistered / Unconfirmed
GUEST, unregistred user!
我在DLL中做了两个函数reverseStr和squared,其中一个函数ReverseStr
调用成功,但squared始终调用不成功.请大侠帮助找找毛病在什么地方.
源程序如下:
library Reverse;
uses
SysUtils,
Classes,
reverse01 in 'reverse01.pas',
reverse02 in 'reverse02.pas';
exports
Squared,ReverseStr;
begin
end.

unit reverse01;
interface
uses
SysUtils,
Classes;
function ReverseStr(StrToReverse:Pchar):integer;export;stdcall;
implementation
function ReverseStr(StrToReverse:Pchar):integer;
var
BFGLen:Integer;
Temp:char;
Count:Integer;
begin
BFGLen:=strLen(StrToReverse);
for count:=0 to (BfGLen div 2)-1 do
begin
temp:=strToReverse[count];
strToReverse[count]:=strToReverse[BFGLen-1-Count];
strToReverse[BFGLen-1-Count]:=Temp;
end;
ReverseStr:=0;
end;
end.

unit reverse02;
interface
uses
SysUtils,
Classes;
function Squared(va:integer):integer;export;stdcall;
implementation
function Squared(va:integer):integer;
var
va1:integer;
va2:integer;
begin
va1:=va;
va2:=va1*va1;
va:=va2;
squared:=va1;
end;
end.



unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
Edit1: TEdit;
Edit2: TEdit;
Edit3: TEdit;
Edit4: TEdit;
Edit5: TEdit;
Edit6: TEdit;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.Button1Click(Sender: TObject);
type
TDllFunc1=function(VarStr:string):integer;stdcall;
TDllFunc2=function(varint:integer):integer;stdcall;
var
hlib:Thandle;
DllFunc1:TDllFunc1;
DllFunc2:TDllFunc2;
SouStr:string;
SouNum:integer;
begin
hlib:=LoadLibrary('Reverse.dll');
if hlib=0 then
begin
showMessage('Can not Open Dll');
exit;
end;
DllFunc1:=TDllFunc1(GetProcAddress(hlib,'ReverseStr'));
DllFunc2:=TDllFunc2(getprocaddress(hlib,'Suqared'));
if @DllFunc1=nil then
ShowMessage('function reversestr fail!')
else
begin
SouStr:=edit1.text;
Edit2.text:=intToStr(dllfunc1(SouStr));
edit3.text:=SouStr;
end;
if @DllFunc2=nil then
showMessage('function squared fail!')
else
begin
SouNum:=StrToint(edit4.Text);
edit5.Text:=inttostr(dllfunc2(sounum));
edit6.Text:=inttostr(souNum);
end;
FreeLibrary(hlib);
end;

end.
 
; function Squared(va:integer):integer;
var
va1:integer;
va2:integer;
begin
va1:=va;
va2:=va1*va1;
va:=va2;
squared:=va1;
end;
end.


这是不是写错了?
 
不知看出错在什么地方?
 
你求什么?平方?这样行吗?
 
将源变量的值用函数的值返回,将平方值用源变量带回.
 
你的程序有一个求字符串的反序,如Abcd,得dcbA;
你的问题,本论坛刚刚讨论过,我也将调用方法贴了出来,估计该问题还未结束,
可查看一下!
你的程序确实有使用不当的地方,如

exports
Squared,ReverseStr;
是否应写成:
Exports
Squared index 1 name Squared;
ReverseStr index 2 name ReverStr;

 
关于反序的问题前面已经解决,在此主要问题是DLL中两个及两个以上的函数调用问题.
 
看来是squared的问题,我把dll中只包含他
然后只调用他也不对!
在等一会!
 
经过反复调试,只要将squared中的变量定义成var 型,能调用成功.
 
begin
va1:=va;
va2:=va1*va1;
va:=va2; // va是变量
squared:=va1;
end;

还是的嘛!
 
〉经过反复调试,只要将squared中的变量定义成var 型,能调用成功
//Faint
你在pascal语言传递参数的基本原理上没有弄清:var型传递的是变量参数,
结果会返回。 没有var的传递的是值参数,结果不会返回。

同您是否使用了DLL没有关系
 
诸位是否作过包含async32控件的DLL,能否给出一个实例?
 
也许第三方控件不能脱离form,也就是说有可能必须将控件放在form上一起作在
DLL中.
 
感谢各位点拨,我再试一试.如果各位有什么新的建议,请通知我.
 
DLL放入Form是有讲究的,即它不能象在Delphi上那样自由!
 
to hqpeng:
做过, 一个很简单的程序, 功能就是读写磁卡.
不过这个实例跟你的问题好象没什么可关联的.
 
to Another_eYes:
我不明白你的意思,是在DLL中放入Form很简单,还是将控件直接放入DLL很简单?
最好你能给我一点提示,或给个简单的示例,以免走太多的弯路.
 
看的人真多,大家对DLL都感兴趣,可是就没有人愿意给个例子.
 
是太简单,还是我太苯,反正我是糊涂了.
 

Similar threads

I
回复
0
查看
782
import
I
I
回复
0
查看
771
import
I
I
回复
0
查看
816
import
I
I
回复
0
查看
651
import
I
后退
顶部