以下是《Delphi5 开发人员指南》书中第9章DLL的例子(246页):
//DLL文件:
library DLLEntryLib;
uses
  SysUtils,windows,dialogs,classes;
procedure DLLEntryPoint(dwReason:DWord);
begin
  case dwReason of
    DLL_PROCESS_ATTACH:ShowMessage('Attaching to Dll');
    DLL_PROCESS_DETACH:ShowMessage('Detaching from process');
    DLL_THREAD_ATTACH:messagebeep(0);
    DLL_THREAD_DETACH:messagebeep(0);
  end;
end;
begin
  DllProc:=@dllEntryPoint;
  DLLEntryPoint(DLL_PROCESS_ATTACH);
end.
////////////////////////////////////////
//装载DLL
procedure TForm1.btnLoadLibClick(Sender: TObject);
begin
  if LibHandle=0 then
  begin
    LibHandle:=LoadLibrary('DllEntryLib.dll');
    if LibHandle=0 then
      raise Exception.Create('Unable to load DLL');
  end
  else
    ShowMessage('Library already loaded');
end;
//卸载DLL
procedure TForm1.btnFreeLibClick(Sender: TObject);
begin
  if not (LibHandle=0) then
  begin
    FreeLibrary(LibHandle);
    LibHandle:=0;
  end;
end;加载DLL一切正常,当单击btnFreeLib按钮卸载DLL时应该弹出'Detaching from process'的消息框,但实际并没有弹出,为什么?
书中测试程序还创建了子线程,但子线程创建和结束时DLL也没有发出声音,为什么?
(Delphi 6.0 Win2K中文版)

解决方案 »

  1.   

    哈哈,要看到你的问题,我就不用提问了.
    又浪费了20分.....
    楼主.我想这应该是DELPHI版本的操作系统的问题.我和你用的版本完全相同.
    同一个DLL项目文件编译出来,要比98下小10K,不知道为什么.
    哪位高人指点一下.
      

  2.   

    To:Linux2001(我想买手提电脑啊!)
    我完全按照书上的程序写的,没有改动。
    我想可能是版本问题,谁用其他版本的Delphi,能帮忙编译一下吗?
      

  3.   

    我在使用Dll中也遇到过这个问题,百思不得其解,后来在论坛上看到,这是delphi一个bug,dll释放时,并不会自己调用哪个DLLEntryPoint函数,想要修改过来比价麻烦.
    我的解决方法是自己写个函数来释放dll中引用的资源!
      

  4.   

    to  aiirii(aiirii) 能不能仔细说说?
      

  5.   

    To: peiweiwei(一指残) 
    你用的是什么版本?
      

  6.   

    不会吧
    我在 BCB 5.0 使用的非常正常呀-----------------------------------
    什么时候有时间、有朋友一起去踢球呢?
      

  7.   

    在98和XP下都能完成,就是2K下不行.
      

  8.   

    begin
      DLLProc := @dllEntryPoint;
      DLLProc(DLL_PROCESS_ATTACH);
      DLLProc(DLL_PROCESS_DETACH);
    end.
      

  9.   

    就是说,我们的本意是在我们要释放该dll时,自动执行DLL_PROCESS_DETACH那一段代码,做些清除工作,但由于delphi 的一个bug,造成,在dll释放时,并不会调用DLLEntryPoint;
    我看过有几个解决方法,有一个是修改system.pas的代码,修正其中的bug,过程比较麻烦,涉及到汇编的知识.
    而我,在我的项目中,采取了一个折衷的办法,也许不是很好.就是,主程序在调用FreeLibrary前,先调用一个自定义的FreeDll,其实,也可调用DLLEntryPoint(DLL_PROCESS_DETACH);手动释放占用的系统资源
      

  10.   

    我上面写的不对,不应该直接调用 DLLProc(DLL_PROCESS_DETACH);。我用delphi6(update2)  xp delphi下可以自动调用DLL_PROCESS_DETACH。不过我写的dll在释放资源是也出了个问题(至今未解决)。