11

我对某事感到好奇。我正在开发 Windows 服务并将所有诊断事件记录到 Windows 事件日志中。因此,当服务运行时,我打开事件查看器(从管理工具)来查看我的服务操作的结果。

这很好用,除了我需要卸载我的程序时(再次,为了测试目的。)由于某种奇怪的原因,事件查看器为我的服务锁定了 .exe 图像文件,因此卸载程序无法删除它错误代码ERROR_SHARING_VIOLATION

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

这仅在 Vista 和更高版本的操作系统上发生,在 XP 上似乎不是问题。

知道如何让事件查看器释放文件锁吗?(我问的是编程方法。我显然可以手动关闭它,但这不是我想要的。)

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 回答
4

我以这种方式释放了锁:

  1. 开始 -> 服务
  2. 找到Windows 事件日志
  3. 右键单击->重新启动
于 2020-05-26T02:44:12.370 回答
2

我刚遇到同样的问题。DLL 被 svchost.exe 进程锁定(Windows 音频、DHCP 客户端、Windows 事件日志、TCP/IP NetBIOS 帮助程序、安全中心、任务计划程序)

解决方案:关闭事件查看器!:)

于 2016-07-09T02:09:04.083 回答