C++ 如何在卸载dll文件后删除该文件

C++ 如何在卸载dll文件后删除该文件,c++,winapi,C++,Winapi,我想在DLL从程序中卸载时删除它,比如调用FreeLibrary或程序关闭时。如何做到这一点?一般来说,任务非常简单-调用DeleteFile;如果失败,即dll仍然被锁定,则使用MOVEFILE\u DELAY\u调用MoveFileEx,直到\u REBOOT标志。但是,如果dll位于“程序文件”中的某个位置,则程序将无法在不提高权限的情况下删除它。也就是说,用户必须以“管理员”身份重新运行程序,并确认权限提升。加载程序后,您应该能够立即将其删除。用户从未真正删除文件,他们只是取消链接。当没

我想在DLL从程序中卸载时删除它,比如调用FreeLibrary或程序关闭时。如何做到这一点?

一般来说,任务非常简单-调用DeleteFile;如果失败,即dll仍然被锁定,则使用MOVEFILE\u DELAY\u调用MoveFileEx,直到\u REBOOT标志。但是,如果dll位于“程序文件”中的某个位置,则程序将无法在不提高权限的情况下删除它。也就是说,用户必须以“管理员”身份重新运行程序,并确认权限提升。

加载程序后,您应该能够立即将其删除。用户从未真正删除文件,他们只是取消链接。当没有进一步打开的句柄时,操作系统将执行删除操作。但我不能100%肯定这在Windows上是准确的;仔细检查。@Ron我知道怎么做。当dll被注入内存时,我无法删除它,所以我想在它未加载时删除它。您可以轮询GetModuleHandle。否则,如果您想要一个通知,那么您将不得不调试进程,并等待DLL的UNLOAD\U DLL\U debug\U事件。您需要一个外部调试器进程来设置事件,因为程序无法自行调试。@KerrekSB-从技术上讲,它可以在windows上工作。用于打开文件的core usermode API CreateFile在关闭时支持标志文件标志删除,该标志文件将在关闭所有句柄时取消文件链接并将其删除。但是,要实际使用它,所有调用者都必须使用FILE_SHARE_DELETE sharing mode标志,实际上,共享标志并没有太多指定。我很确定OS dll加载程序没有使用它。@ChrisBecke:谢谢-我忘了Windows通常会锁定文件。MOVEFILE\u DELAY\u UNTIL\u REBOOT只能由管理员或系统使用。其他用户无权修改会话管理器的FileRenameOperations密钥。