私たちの exe の多くは、B.dll を動的にロードします。B.dll は一時ファイルに自身のコピーを作成し、%TMP%\B-.dll をリロードします。このコードを使用して B-.dll を削除対象としてマークしようとしていますが、LoadLibrary 呼び出しが原因で、「アクセスが拒否されました」というエラーで失敗します。
char ourDllPath[MAX_PATH];
// ... set ourDllPath to absolute path...
char tempPath[MAX_PATH];
DWORD dwRetVal = GetTempPath(MAX_PATH, tempPath);
char shadowPath[MAX_PATH];
UINT uRetVal = GetTempFileNameA(tempPath, "FOO_", 0, shadowPath);
BOOL ok = CopyFileA(ourDllPath, shadowPath, false);
HMODULE hShadowDll = LoadLibraryA(shadowPath);
typedef int (WINAPI *PRESUMEFOO)();
PRESUMEFOO onload2 = (PRESUMEFOO)GetProcAddress(hShadowDll,"_Resume_Foo@0");
BOOL ok2 = DeleteFileA(shadowPath); // Fails with "Access is denied"
ただし、ここ ( http://msdn.microsoft.com/en-us/library/windows/desktop/aa363915(v=vs.85).aspx ) によると、これは可能である必要があります。
「DeleteFile 関数は、ファイルを閉じるときに削除するようにマークします。したがって、ファイルの最後のハンドルが閉じられるまで、ファイルの削除は行われません。」
WindowsサーバーOSで現在開いているファイルを閉じるときに削除するようにマークする方法についてのアイデアはありますか?