动态调用DLL的问题

baiylhnh 2013-01-26 07:39:41
请帮我把有****的地方解释一下..详细详细!!!

//

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;
...全文
353 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
静_海 2013-01-27
  • 打赏
  • 举报
回复
楼主:你大概比较熟悉 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 运行时会出错:因为少往堆栈压入一个参数,整个堆栈都会乱套,可能会是很严重的错误。
baiylhnh 2013-01-27
  • 打赏
  • 举报
回复
引用 2 楼 jinghai1776 的回复:
Getfun 是一个函数类型。 fun 是此函数类型的变量,在这里就相当于函数名称了,所以后面的 fun(2, 2) 等于调用了这个函数。 @fun 是这个函数的地址,给 @fun 赋值等于这个函数有了实例。在赋值之前调用 fun(2, 2) 要出不可预知的严重错误,所以调用前要用 if Assigned(@Fun) 来检查赋值是否成功。 如果用 C++……
你说的我都知道.就是不明白什么意思嘛 1函数类型是个什么类型.有什么用 2@fun 是这个函数的地址 ,我用其它地址不行么.比如自定义的pointer
hushoubo 2013-01-27
  • 打赏
  • 举报
回复
楼上正解 .....
静_海 2013-01-27
  • 打赏
  • 举报
回复
Getfun 是一个函数类型。 fun 是此函数类型的变量,在这里就相当于函数名称了,所以后面的 fun(2, 2) 等于调用了这个函数。 @fun 是这个函数的地址,给 @fun 赋值等于这个函数有了实例。在赋值之前调用 fun(2, 2) 要出不可预知的严重错误,所以调用前要用 if Assigned(@Fun) 来检查赋值是否成功。 如果用 C++ 写,就没这么多事,甭管什么地址,直接用就行。Pascal 是强类型语言,编译器要对所有变量做类型检查,这样很多错误在编译期间就能发现,免得在运行时出错搞得一头雾水,但也让 C++ 码农对 Delphi 的类型定义很不适应。
hsfzxjy 2013-01-26
  • 打赏
  • 举报
回复
1。定义一个function类型

16,748

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 语言基础/算法/系统设计
社区管理员
  • 语言基础/算法/系统设计社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧