动态调用DLL可以得到句柄,但
静态调用DLL时,得到句柄?

解决方案 »

  1.   

    调用DLL有两种方法,一种是在应用程序装载时调用,另一种是在应用程序运行时调用。
    首先介绍装载时DLL的调用:  (1)装载时调用DLL  在调用DLL的Pas文件中,对DLL函数进行外部声明,
    声明应位于Implementation的Uses语句后,形式如下:  Implementation  Uses Dialogs;  Function Name(argment):Boolean;far;External 'CallName';    其中External关键字后面的引号内的字串是DLL的文件名。
    声明以后即可在Pas文件任何地方引用DLL函数。  装载时调用DLL的优点是速度较快,程序间也可共享代码。  (2)运行时调用DLL  DLL的另一种调用方法是在运行时调用。
    要调用到Windows的API函数:LoadLibrary,GetProcAddress等。
    主要用于调用DELPHI和其它语言,特别是C++编译的DLL。  假定你的DLL包括一个函数:  Function MyFunc(aparam:word):string;export;  首先在程序Type类型声明处加入一句:  Type
        TMyfunc = function(aparam:word):string;  此句的作用如同C++中声明的函数指针。  然后定义如下变量∶  Var
         aptr:TFarproc;
         lhnd:THandle;
         s:string;  其中Aptr,lhnd两变量声明必须有,s是DLL函数返回值,视情况而定。  在调用DLL处加入如下语句进行DLL装载:
      lhnd:=Loadlibrary('路径:DLL文件名');{如lhnd:=Loadlibrary('c:\aa\bb.dll');
      aptr:=GetprocAddress(lhnd,'Myfunc');  下面可直接调用DLL了:
      s:=TMyfunc(bptr)(60);{根据函数填相应的变量参数}  调用完以后,用FreeLibrary释放DLL占用的内存:
      FreeLibrary(lhnd);
      

  2.   

    在dll定义一个接口,将主程序的application.handle通过接口传过去即可。
      

  3.   

    谢谢My_first(小@_@小)的讲解
    但静态调用DLL如何得到其句柄?
      

  4.   

    下面是我写的静态装载一个.jpg图像文件,这个文件放在资源文件里的.res
    var
      Stream:TResourceStream;
      MyJpg: TJpegImage;
      h: THandle;
      begin
      Stream:=nil;
      MyJpg:=nil;
      h:=0;//H存放的是句柄.
      Try
        h := LoadLibrary(Pchar(ExtractFilePath(Application.ExeName)+'dll\Ytdll.dll'));
        if h <>0 then
        Begin
             Stream := TResourceStream.Create (H,str,RT_RCDATA) ;
             try
             MyJpg:=TJpegImage.Create;
             MyJpg.LoadFromStream (Stream) ;
             finally
             MYJPG.FREE;
             end;
          end;
         Finally
             Stream.Free;
             FreeLibrary(h);
         end;    
    end;
      

  5.   

    My_first(小@_@小)
    你用的是LoadLibrary和
    FreeLibrary
    这不是动态装载DLL吗?
      

  6.   

    HMODULE GetModuleHandle(
      LPCTSTR lpModuleName   // module name
    );