Мне интересно о чем-то. Я занимаюсь разработкой службы Windows и записываю все диагностические события в журнал событий Windows. Поэтому, когда служба работает, я открываю Просмотр событий (из средств администрирования), чтобы просмотреть результаты работы моей службы.
Это прекрасно работает, за исключением того момента, когда мне нужно удалить свою программу (опять же, для целей тестирования). По какой-то странной причине программа просмотра событий блокирует файл образа .exe для моей службы, поэтому деинсталлятор не может удалить его с помощью код ошибки ERROR_SHARING_VIOLATION
:
The process cannot access the file because it is being used by another process.
Это происходит только в Vista и более поздних ОС и, похоже, не является проблемой для XP.
Любая идея, как заставить Event Viewer снять блокировку файла? (Я спрашиваю о программном подходе. Я могу закрыть его вручную, но это не то, что мне нужно.)
В Vista появилась менее известная функция под названием Restart Manager, которая может помочь вам снять блокировку файлов с помощью кода пользовательского режима. Так как вы пометили его как 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;
}
Я только что встретил ту же проблему. DLL была заблокирована процессом svchost.exe (Windows Audio, DHCP-клиент, журнал событий Windows, TCP / IP NetBIOS Helper, Центр безопасности, Планировщик задач)
Решение: закрыть Event Viewer! 🙂