【问题标题】:Windows Event Viewer holds a lock on my EXE fileWindows 事件查看器锁定了我的 EXE 文件
【发布时间】:2013-08-29 07:29:11
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 事件查看器打开文件以访问字符串资源(类别名称、事件描述等)。我想你可以尝试从它下面关闭文件,但如果事件查看器出错,这可能不会是一个好的用户体验。不过,这确实是一个更大的问题。如果某个备份或防病毒程序在您尝试删除该文件时将其“锁定”了怎么办?
  • @Luke:是的,同意。尽管这些问题中的大多数来自编写不佳的软件,例如acrotray.exe 或所有那些可能成为 AVP 的东西。即使事件查看器需要访问资源,它也没有理由持有文件锁。它可以读取它们然后释放文件锁(很像在 XP 中所做的。)
  • 您可能需要考虑将资源放入资源 DLL 中。尽管如此,该 DLL 仍会被事件查看器锁定。
  • @MSalters:谢谢,它只会转移问题。不过,我并没有真正理解,使用下面建议的重启管理器方法,我从来自这些的svchost.exe 进程中获得了 6 个锁:Windows AudioDHCP ClientWindows Event LogTCP/IP NetBIOS HelperSecurity Center、@ 987654330@。任务计划程序和 Windows 音频?真的吗?
  • 我看到了误导性的错误消息无法完成操作,因为文件已在 DHCP 客户端中打开。相同的原因:事件查看器正在打开。

标签: c++ windows winapi event-viewer


【解决方案1】:

Vista 中引入了一个鲜为人知的功能,称为重新启动管理器,它可以帮助您通过用户模式代码释放文件锁定。由于您将其标记为 C++,因此基于this article,这是一个小代码示例:

#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;
}

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      我是这样释放锁的:

      1. 开始 -> 服务
      2. 找到 Windows 事件日志
      3. 右键->重启

      【讨论】:

      • 谢谢!这正是我所需要的。
      猜你喜欢
      • 2012-07-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-25
      相关资源
      最近更新 更多