2013-08-26 4 views
4

Мне что-то интересно. Я разрабатываю службу Windows и регистрирую все диагностические события в журнале событий Windows. Поэтому, когда служба работает, я открываю средство просмотра событий (из инструментов администрирования) для просмотра результатов моей службы.Windows Event Viewer хранит блокировку моего EXE-файла

Это прекрасно работает, за исключением момента, когда мне нужно удалить мою программу (опять же, для целей тестирования). По какой-то странной причине средство просмотра событий хранит блокировку в файле .exe для моей службы, поэтому деинсталлятор не работает чтобы удалить его с кодом ошибки ERROR_SHARING_VIOLATION:

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

Это происходит только на Vista, и более поздних версий ОС и, кажется, не будет проблемой на XP.

Любая идея, как заставить Event Viewer освободить блокировку файла? (Я спрашиваю о программном подходе. Я могу закрыть его вручную, но это не то, что мне нужно.)

+0

Средство просмотра событий открывает файл, чтобы получить доступ к строковым ресурсам (имена категорий, описания событий и т. Д.). Я думаю, вы могли бы попытаться закрыть файл из-под него, но это, вероятно, не будет хорошим пользовательским интерфейсом, если Event Viewer выйдет из игры. Это действительно большая проблема, чем это. Что делать, если какая-либо резервная или антивирусная программа имеет файл «заблокирован» в тот момент, когда вы пытаетесь его удалить? – Luke

+0

@ Лука: Да, согласился. Хотя большинство из этих проблем исходят из плохо написанного программного обеспечения, например, 'acrotray.exe' или всех этих потенциальных AVP. Также нет никакой причины, чтобы Event Viewer сохранял блокировку файлов, даже если ему нужно получить доступ к ресурсам. Он может их прочитать, а затем отпустить блокировку файла (как в XP). – c00000fd

+0

Возможно, вам стоит рассмотреть возможность размещения ресурсов в DLL ресурса. Тем не менее, эта DLL будет заблокирована Event Viewer. – MSalters

ответ

4

В Vista появилась менее известная функция, называемая Restart Manager, которая может помочь вам освободить блокировки файлов через код пользовательского режима. Так как вы помечены как 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; 
} 
0

Я только что встретил ту же проблему. DLL была заблокирована процессом svchost.exe (Windows Audio, DHCP-клиент, журнал событий Windows, помощник NetBIOS TCP/IP, диспетчер задач, планировщик заданий)

Решение для закрытия событий! :)

 Смежные вопросы

  • Нет связанных вопросов^_^