Определите, заблокирован ли файл (dll / exe) процессом или библиотекой - PullRequest
2 голосов
/ 21 августа 2009

Я планирую написать пример программы, которая идентифицирует файл (файл dll), заблокированный / используемый каким-либо процессом.

Как мы можем достичь этого программно, используя WIN API (функция C / C ++)? На самом деле, когда мы выполняем какой-либо процесс обновления программного обеспечения, другой процесс может использовать библиотеку, которая временно не выполнит операцию обновления.

Лучший пример, который я хотел бы привести здесь, - это инструмент Unlocker, в котором перечислены все процессы / dll, которые используют определенный файл.

Ответы [ 5 ]

4 голосов
/ 21 августа 2009

Вы можете попробовать открыть файл (ы) самостоятельно для эксклюзивного доступа. Если в каком-либо другом процессе они открыты, произойдет сбой.

1 голос
/ 21 августа 2009

В Windows файл не «заблокирован» или «разблокирован». Если файл открыт, режим общего доступа, указанный при его открытии, определяет, если и при каких обстоятельствах другие попытки открыть файл будут успешными.

Если указан флаг FILE_SHARE_NONE, то файл полностью заблокирован, и ни при каких обстоятельствах любая другая попытка открыть файл не будет успешной. Если было указано FILE_SHARE_READ, попытки открыть файл с доступом GENERIC_READ будут успешными, но, например, GENERIC_WRITE не удастся. FILE_SHARE_WRITE разрешает открывать другие дескрипторы для доступа к записи, а FILE_SHARE_DELETE - для удаления.

Как только вы решили, какой уровень исключения вы считаете «заблокированным», вы можете просто попытаться открыть каждый файл с соответствующим доступом и посмотреть, не получится ли с ошибкой ERROR_SHARING_VIOLATION или нет.

1 голос
/ 21 августа 2009

Если вам не нужно знать, какие процессы используют рассматриваемый файл, вы можете просто открыть файл для монопольного доступа, используя CreateFile.

::CreateFile(filename, 0, 0, 0, OPEN_EXISTING, 0, 0);
1 голос
/ 21 августа 2009

Я не думаю, что можно определить процессы без написания драйвера. К счастью, Ручка Руссиновича включает в себя такой драйвер; Я предлагаю вам запустить этот инструмент.

0 голосов
/ 23 августа 2009

Мне кажется, что Windows API предоставляет EnumProcesses (), чтобы легко получить список активных processID и EnumProcessModules, чтобы получить список дескрипторов модуля (то есть, если EXE и DLL связаны с ним) для каждого процесса; наконец, GetModuleFileNameEx () дает вам полный путь и имя файла загруженного модуля.

Таким образом, вы можете легко перебирать все загруженные имена DLL и, по крайней мере, знать, какой процесс их удерживал, если вы обнаружили проблему - и, возможно, автоматически завершить этот процесс.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...