读书人

动态调用DLL的有关问题

发布时间: 2013-02-02 12:27:16 作者: rapoo

动态调用DLL的问题
本帖最后由 baiylhnh 于 2013-01-26 19:40:17 编辑 请帮我把有****的地方解释一下..详细详细!!!

//


procedure TForm1.Button1Click(Sender: TObject);
type
Getfun=function (x,y:integer):dword;stdcall; ******这个什么意思?为啥没有函数名
var
DllHandle:Thandle; //DLL句柄
fun:Getfun; *****这个也不明白
begin
DllHandle:=loadlibrary('mydll.dll'); 加载DLL并返回句柄
if Dllhandle <>0 then
begin
try *****下面这句.如果需要指针.直接给指针地址不行么,如pinteger
@fun:=getprocaddress(DllHandle,'myfun'); //获得函数名入口地址,并返回地址
if Assigned(@Fun) then ****这句是检测是否给fun这个地址分配内存了么
begin
showmessage(inttostr(fun(2,2)));
end;
finally
freelibrary(dllhandle); //释放
end;
end
else
showmessage('未找到dll文件');
end;

[解决办法]
楼主:你大概比较熟悉 C++ 编程,对 Delphi 这一套不习惯。再解释一下。

你调用的是 DLL 函数,Delphi 在调用前必须知道此函数有哪些参数,返回值是什么,怎么知道?你必须先定义一个函数类型,从而告诉 Delphi 这些(其实 C++ 也需要这种定义,只是定义方式不同)。

你当然可以把 getprocaddress(DllHandle,'myfun') 返回的函数地址赋值给一个 Pointer 类型的变量,但是你不能直接用这个 Pointer 变量当函数来调用,因为 Delphi 不知道函数的参数和返回值是如何定义的。所以,你还是要把这个地址赋值给 @fun,然后调用 fun 才行。fun 这个名字无所谓,你可以叫做 myfun 或别的什么名字,关键是前面的函数类型定义要和 dll 中的实际函数一致才行。

你不妨把那个函数定义(function(x, y: Integer): dword; stdcall; ),修改一下,例如,去掉一个参数,程序肯定会出错。编译时就会报错:函数调用和函数定义不符。你不妨在调用时也去掉一个参数(变成 fun(2)),编译时不出错了,dll 运行时会出错:因为少往堆栈压入一个参数,整个堆栈都会乱套,可能会是很严重的错误。

读书人网 >.NET

热点推荐