刚学delphi,看了个动态调用dll的例子,有些不明白,把代码贴出来,请高手讲解,谢谢!这个dll很简单就是求3n,但是有几点不明白,感觉静态调用比动态调用简单多了啊1.if Handle>32 then。。  不知道为什么要和32做比较呢?
2.if @addc<>nil then。。 这个也迷糊
3.还有就是这个动态调用dll的思想,弄了一个函数指针,然后后面都看不懂了,麻烦讲一下,非常感谢!
一、Dll建立(一)DLL的建立library mydll;
usesbase in 'base.pas';
exportsTriple name 'Tr';
{$R *.res}
beginend.
(二)函数unit base;
interface
uses windows;
function Triple(N:integer):integer;stdcall;
implementation
function Triple(N:integer):integer;stdcall;beginresult:=n*3;end;
end.二、动态调用unit Unit2;
interface
usesWindows, SysUtils, Controls, Forms,StdCtrls, Classes;
typeTForm1 = class(TForm)    Button1: TButton;    Edit1: TEdit;    procedure Button1Click(Sender: TObject);private    { Private declarations }public    { Public declarations }end;
varForm1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);type   Taddc=function(n:integer):integer;stdcall;//定义函数指针varHandle:Thandle;addc:Taddc;beginHandle:=LoadLibrary('mydll.dll');//加载mydllif Handle>32 thenbegin   @addc:=GetProcAddress(Handle,'Tr'); //取Tr函数入口地址,大小写敏感。Tr为mydll中的Triple的exports 的name命名   if @addc<>nil then   begin     edit1.Text:=IntToStr(addc(10));//参数传递,这里直接用10   end;end;Freelibrary(Handle);//从内存释放dllend;
end.

解决方案 »

  1.   

    应该和0比较就可以不等于0就代表加载成功
    If the function succeeds, the return value is a handle to the module.If the function fails, the return value is NULL. To get extended error information, call GetLastError.
    if @addc<>nil then。。 这个也迷糊
    就是判断动态取到的函数地址是否为空,就相当于取得函数的地址,然后再用该函数的指针对该函数进行调用,你可以参考回调函数,是类似的用法
      

  2.   

    简单地说,就是判断你的DLL是否加载成功,然后判断函数调用是否成功。这些条件都具备了就赋值求解。
      

  3.   

    首先要讲清楚静态调用和动态调用的区别。
    1 静态调用,在pas文件中直接指定DLL和定义调用函数,在程序开始运行时,就会自动寻找该DLL,并载入内存。
                a 即是无论你用不用,都要载入到内存中。
                b 如果程序运行时,找不到要载入的DLL,就会报错,无法运行。
                c 通常应用在于系统功能关联密切,必须而且经常使用的DLL。2 动态调用,在程序段中使用LoadLibrary('mydll.dll')加载。
                a 在程序开始运行时,不会自动加载,只有在使用时,再通过LoadLibrary加载。
                b 因此即使没有该DLL,程序的其他功能还可以使用。只是要用到该DLL,发现没有才会报错。
                c 通常应用于对系统功能关联不密切,使用频率低的DLL。当然也有节省内存,优化性能的特点。然后针对问题解答。
    1.if Handle>32 then,这句用于判断句柄是否合法,0是调用失败,印象中32以下为windows系统保留值。因此安全起见,就设为>32了。
    2.if @addc<>nil then,这句用于判断调用dll中函数,的指针是否为空。非空为取得函数地址,调用成功;空则失败。
    3.动态调用dll的思想,源于C语言传统指针调用方法,首先要清楚函数指针的概念,指针是一个4个字节的地址,指向内存中执行函数的首地址。
                           a 程序中先定义一个函数指针,是为了获得dll中的函数地址作准备。
                           b 程序LoadLibrary('mydll.dll')后,dll中的tr函数就自动分配了内存地址。
                           c @addc:=GetProcAddress(Handle,'Tr'),就是将tr函数的地址赋值给@addc。addc就可以作为tr函数使用了。
                           d Freelibrary与LoadLibrary要成对使用,是为了保证调用的内存空间有效释放。