2

私たちの 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で現在開いているファイルを閉じるときに削除するようにマークする方法についてのアイデアはありますか?

4

0 に答える 0