例如,A进程加载了A.dll,我如何在A进程运行的情况下将A.dll卸载掉?

解决方案 »

  1.   

    用远线程注入原理,
    不过卸载掉A.dll后,若进程A又调用A.dll相关的,估计又载入A.dll
      

  2.   

    谢谢lovenoend(有容乃大) ,是否能详细的讲解一下,最好有代码示范,我不太清楚如何利用远程线程。A再次调用A.dll的情况可以不考虑,我主要想在卸载掉A.dll后就删除了A.dll。
      

  3.   

    老兄,如果你的目的仅仅是想删dll文件,何必劳师动众去写什么程序,把那个进程关掉然后删dll不就是了
      

  4.   

    to halk(夜风) ,大哥,你想过没有,要是这么简单我没事发帖子问什么啊。
    好多dll我一时确定不了是哪个进程在使用,而且即使确定了,由于该进程是服务或其他原因(如它就是explorer.exe结束了也没用,我迟早还是要运行它的)结束不掉,再一种情况是,即使进程结束了,可dll依然没有从内存中退出,依然无法删除。这就是我发贴的原因。
      

  5.   

    明白了,不过我没试过,只能从原理上提些建议,讨论一下。再一种情况是,即使进程结束了,可dll依然没有从内存中退出,依然无法删除。这就是我发贴的原因。
    ------------------
    每当DLL加载到一个进程的时候,都会有相应的引用值,当这个值减到0的时候系统就把它从此进程中卸载了,进程结束的时候也一样会卸载它们;但是如果同时还有其它进程在引用这个DLL,那么仍然不能删掉,只有当所有的进程都把它卸载的时候,内存影像才会关闭,文件才能删掉。所以,删不掉很可能是还有其他进程在使用它。好多dll我一时确定不了是哪个进程在使用
    ------------------
    这该怎么办,一个一个的找?看看有没有别人给出更好的办法而且即使确定了,由于该进程是服务或其他原因(如它就是explorer.exe结束了也没用,我迟早还是要运行它的)结束不掉
    ------------------
    没别的办法,不能把服务都停掉吧?当然也可以试试,看看哪些是可以停掉而不至于down机的(从服务列表中停)。实在不行,就只能启动到dos去删了;如果是NTFS的分区DOS还看不见,不知道启动到win2k的诊断控制台能否删掉。
      

  6.   

    同意一楼,用远程线程调用GetModuleHandle获得a.dll的模块句柄,然后调用FreeLibrary卸载。