我想问一下,程序调用了DLL的窗口,当关闭了窗口,如何释放这个DLL啊,
我关闭了DLL的窗口,可是它仍然驻留在内存中
我如果要改这个DLL,必须要关掉这个程序先
如何可以在不关掉这个程序,就可以修改这个DLL
即关闭这个DLL窗口时,同时释放它

解决方案 »

  1.   

    看你是静态加载的还是动态加载了,如果要达到你的目的,最好用动态加载,类似
    hDll := LoadLibrary('DllName');
    try
      ShowDllWindow();
      ...
    finally
      if hDll > 0 then 
        FreeLibrary(hDll);
    end;
      

  2.   

    首先要讲清楚静态调用和动态调用的区别。
    1 静态调用,在pas文件中直接指定DLL和定义调用函数,在程序开始运行时,就会自动寻找该DLL,并载入内存。
      A 即是无论你用不用,都要载入到内存中。
      B 如果程序运行时,找不到要载入的DLL,就会报错,无法运行。
      C 通常应用在于系统功能关联密切,必须而且经常使用的DLL。2 动态调用,在程序段中使用LoadLibrary('mydll.dll')加载。
      A 在程序开始运行时,不会自动加载,只有在使用时,再通过LoadLibrary加载。
      B 因此即使没有该DLL,程序的其他功能还可以使用。只是要用到该DLL,发现没有才会报错。
      C 通常应用于对系统功能关联不密切,使用频率低的DLL。当然也有节省内存,优化性能的特点。
      D Freelibrary与LoadLibrary要成对使用,是为了保证调用的内存空间有效释放。
    例子:varHandle:Thandle;addc:Taddc;beginHandle:=LoadLibrary('Testdll.dll');//加载dll  @addc:=GetProcAddress(Handle,'Test'); //取Test函数入口地址,大小写敏感。
        
      if @addc<>nil then  begin  edit1.Text:=IntToStr(addc(10));//参数传递,这里直接用10  end;  Freelibrary(Handle);//从内存释放dllend;
      

  3.   

    创建Dll窗口的时候,传递一个句柄参数进去,当前进程的句柄,然赋给将DLL的句柄
    先关闭窗口,然后FreeLibary Dll