首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > .NET >

动态调用DLL的有关问题

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

动态调用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 运行时会出错:因为少往堆栈压入一个参数,整个堆栈都会乱套,可能会是很严重的错误。

热点排行