【发布时间】: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 Audio、DHCP Client、Windows Event Log、TCP/IP NetBIOS Helper、Security Center、@ 987654330@。任务计划程序和 Windows 音频?真的吗? -
我看到了误导性的错误消息无法完成操作,因为文件已在 DHCP 客户端中打开。相同的原因:事件查看器正在打开。
标签: c++ windows winapi event-viewer