11

私は何かについて興味があります。Windows サービスを開発しており、すべての診断イベントを Windows イベント ログに記録しています。そのため、サービスの実行中に (管理ツールから) イベント ビューアーを開いて、サービスの操作の結果を表示します。

これは、プログラムをアンインストールする必要がある瞬間を除いて(テスト目的で)うまく機能します。何らかの奇妙な理由で、イベントビューアーはサービスの.exeイメージファイルをロックしているため、アンインストーラーはそれを削除できませんエラーコードERROR_SHARING_VIOLATION:

The process cannot access the file because it is being used by another process.

これは Vista 以降の OS でのみ発生し、XP では問題にならないようです。

Event Viewer にファイル ロックを解除させる方法はありますか? (プログラムによるアプローチについて質問しています。明らかに手動で閉じることができますが、それは私が求めているものではありません。)

4

3 に答える 3

5

ユーザー モード コードを介してファイル ロックを解除するのに役立つ再起動マネージャーと呼ばれる、Vista で導入されたあまり知られていない機能があります。C++ としてタグ付けしたので、この記事に基づいて、これを行うための小さなコード サンプルを次に示します。

#include <RestartManager.h>
#pragma comment(lib ,"Rstrtmgr.lib")

BOOL ReleaseFileLock(LPCTSTR pFilePath)
{
    BOOL bResult = FALSE;

    DWORD dwSession;
    WCHAR szSessionKey[CCH_RM_SESSION_KEY+1] = { 0 };
    DWORD dwError = RmStartSession(&dwSession, 0, szSessionKey);
    if (dwError == ERROR_SUCCESS) 
    {
        dwError = RmRegisterResources(dwSession, 1, &pFilePath,
            0, NULL, 0, NULL);
        if (dwError == ERROR_SUCCESS) 
        {
            UINT nProcInfoNeeded = 0;
            UINT nProcInfo = 0;
            RM_PROCESS_INFO rgpi[1];
            DWORD dwReason;

            dwError = RmGetList(dwSession, &nProcInfoNeeded,
                &nProcInfo, rgpi, &dwReason);
            if (dwError == ERROR_SUCCESS ||
                dwError == ERROR_MORE_DATA) 
            {
                if(nProcInfoNeeded > 0)
                {
                    //If current process does not have enough privileges to close one of
                    //the "offending" processes, you'll get ERROR_FAIL_NOACTION_REBOOT
                    dwError = RmShutdown(dwSession, RmForceShutdown, NULL);
                    if (dwError == ERROR_SUCCESS)
                    {
                        bResult = TRUE;
                    }
                }
                else
                    bResult = TRUE;
            }
        }
    }

    RmEndSession(dwSession);

    SetLastError(dwError);
    return bResult;
}
于 2013-08-26T19:56:06.820 に答える
2

私はちょうど同じ問題に遭遇しました。DLL が svchost.exe プロセスによってロックされました (Windows オーディオ、DHCP クライアント、Windows イベント ログ、TCP/IP NetBIOS ヘルパー、セキュリティ センター、タスク スケジューラ)

解決策: イベント ビューアを閉じてください。:)

于 2016-07-09T02:09:04.083 に答える