通过LoadLibraryA加载的DLL begin...end 里已做了需要的处理,完成后需要卸载释放资源。但是执行完并不如此,DLL仍然在调用者的进程里,因此我想让DLL被执行完代码后自动让DLL去FreeLibrary自己。有没有办法解决。调用程序的EXE是没办法改动的。只有让DLL自卸载

解决方案 »

  1.   

    不管LoadLibrary,还是FreeLibrary,都会调用begin...end 里面的代码的,只要判断一下就可以初始化或卸载了。library MYAPIDLL;uses
      Classes;
    {$R *.RES}procedure DllEntryPoint(dwReason: DWord);
    begin
     case dwReason of
        Dll_Process_Attach:   ...初始化()... ; 
        Dll_Process_Detach:   ...卸载()...   ; 
     end;
    end;
    begin   DllProc := @DllEntryPoint; //该变量是一个全局变量,由它来指定DLL的入口及出口函数
       DllEntryPoint(Dll_Process_Attach);
    end.
      

  2.   

    楼主得先找以判断"DLL被执行完代码后"这一时刻的方法。
      

  3.   

    楼上都没有理解我的意思Dll_Process_Detach是卸载时执行的方法.我现在需要DLL自动触发卸载,例如,DLL里窗体触发或者其它方式都可以最重要的是“不修改调用程序的源码”,因为调用程序没有FreeLibrary的,因此需要DLL自卸载自己
      

  4.   

    你这个要求有点不合理
    使用Dll要求LoadLibrary和FreeLibrary配对
    没有FreeLibrary时,应该被修改的是exe而不是dll假如exe不FreeLibrary,它就必须得接受进程里多加载一个dll的后果至于说资源的占用、释放,你完全可以在其它地方实现,
    干嘛非要用Dll_Process_Detach?
      

  5.   

    因为需要挂载的DLL占用资源太多,原程序又没办法改动只得做了一个专门卸载其它DLL的DLL,里面用了个TIMER
    用来自动对加载的其他DLL进行卸载。
      

  6.   

    做两个dll,在Dll_Process_Attach时,一个用来加载资源,一个用来释放资源
    保留两个dll总好过保留一大堆不过这是没办法的办法,能修改程序最好修改程序