dll的调用,请救命!(100分)

  • 主题发起人 主题发起人 wzs4743
  • 开始时间 开始时间
W

wzs4743

Unregistered / Unconfirmed
GUEST, unregistred user!
现有一个DLL 含有如下两个函数,可我在调用时老出错,请指教
库名为aver32.dll;
bool pascal _export aver_init(hwnd;bool)
void pascal _export aver_init(void)
请问在delphi内应如何声名和调用!请分别写一下代码!很急,很急!
 
TOpenCom=Function(com:integer):Integer;stdcall;
Procedure Open_com;
Var
OpenCom:TOpenCom;
Begin
LibHandle:=LoadLibrary('Icdll32.dll');
If LibHandle<=0 then
Raise Exception.Create('{LoadLibrary Faile] GetLastError reports:'+
Inttostr(GetLastError));
@OpenCom:=GetProcAddress(LibHandle,'OpenCom');
If OpenCom(ComNu)<>0 Then
Begin
Showmessage('端口无法打开!');
Err_BJ;
end

end;
 
TAver_init1 = function (hwnd: Boolean):Boolean;stdcall;
TAver_init2 = procedure;
Procedure UseDll;
Var
l_Averinit1: TAver_init1;
l_Averinit2: TAver_init2;
Handle: THandle;
Begin
Handle:=LoadLibrary('aver32.dll');
If Handle <= 0 then
begin
Raise Exception.Create('load DLL error!');
Exit;
end
@l_Averinit1:= GetProcAddress(Handle,'aver_init');
@l_Averinit2:= GetProcAddress(Handle,'aver_init');
{可以使用 l_Averinit1 和 l_Averinit2 两个函数了}
{用完之后要释放}
FreeLibrary(Handle);
end;
 
vickowang:你好
非常感谢你的指教,我写了如下的程序,但出现问题
DLL的名字为AVER32.DLL
含有如下函数声名
bool far pascal _export aver_init(hwnd,bool);
void far pascal _export aver_close(void);
我在程序里是这样写的,可以编译通过,执行时出错
错误提示为access violation at address 00000001 read of address ffffffff
我不知道那里错了,请帮我分析一下
taver_init1=function(nowhwnd:hwnd;overlay:boolean):boolean;stdcall;
taver_init2=procedure;stdcall;
然后在 implementation 内
var
handle:thandle;
l_averinit1:taver_init1;
l_averinit2:taver_init2;
procedure usedll;
begin
handle:=loadlibrary('aver32.dll');
if handle<=0 then
begin
raise exception.create('load dll error');exit end;
@l_averinit1:=getprocaddress(handle,'aver_init');
@l_averinit2:=getprocaddress(handle,'aver_close');end;
procedure tform1.button1click(sender:tobject);
begin
usedll;
l_averinit1(form1.handle,false);
end;
procedure tform1.button2click(sender:tobject);
begin
l_averinit2;
freelibrary(handle);
end;
希望你能抽一点时间回复一下,真的很急!
 
你可以使用静态的方法调用啊,
在程序的前面声明即可
 
handle改变一个名字,例如myhandle,并且定义成非过程变量,修改Button2的代码,
freelibrary(myhandle)
 
其实用静态的方法最简单!
function aver_init(hwnd: Boolean):Boolean;stdcall;external 'aver32.dll';
 
1.检查你的函数是否写的正确
2。监测是否找到了库
3。变量名是否冲突
4。函数是否区分大小写。
5。参数列表是否正确。
 
应该是 Calling convention 不对,用 pascal 而不是 stdcall,改成:
taver_init1=function(nowhwnd:HWND
overlay:bool):bool;pascal;
taver_init2=procedure;pascal;
另外,GetProcAddress 可能会失败而返回一个 nil 的(如传入的过程名大小写不匹配时)
因此在调用 l_averinit1 前必须先检查:
if (@l_averinit1 <> nil) then
l_averinit1(form1.handle,false)
else
ShowMessage('Error');


 
多人接受答案了。
 
后退
顶部