Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Как обнаружить, используется ли файл и какой программой в Delphi: решение проблемы с `IFileIsInUse` на Windows 7

Delphi , Синтаксис , API реализация

Как обнаружить, используется ли файл и какой программой в Delphi

При работе с файлами в среде Delphi иногда возникает необходимость проверить, используется ли файл в данный момент и каким приложением. Для решения этой задачи можно использовать интерфейс IFileIsInUse, который предоставляет информацию о том, открыт ли файл и каким процессом.

Проблема с IFileIsInUse

В статье на блоге Delphi-Jedi представлена функция GetFileInUseInfo, которая должна возвращать информацию о том, используется ли файл и какими процессами. Однако, при попытке выполнить приведение указателя к интерфейсу IFileIsInUse, метод QueryInterface возвращает код ошибки E_NOINTERFACE, что указывает на отсутствие реализации этого интерфейса у объекта.

Проблема была замечена на платформе Windows 7 32-битной версии при работе с файлами Word и .msg. Вручную проверка через Проводник и попытка удаления файла показывала корректные данные о приложении, использующем файл. В то же время, в собственном приложении, при попытке отобразить информацию о приложении, использующем файл, возникала ошибка.

Решение проблемы

Согласно подтвержденному ответу, код функции GetFileInUseInfo работает корректно. Проблема заключается в том, что проверяемые программы действительно не реализуют интерфейс IFileIsInUse. Система верно возвращает E_NOINTERFACE, указывая на отсутствие реализации интерфейса.

Для проверки было использовано образец из SDK, который реализует IFileIsInUse. Файлы, добавленные в таблицу IRunningObjectTable этим приложением, успешно обнаруживались функцией GetFileInUseInfo. В то же время, файлы, открытые в Acrobat 8 и Word 2010, не обнаруживали поддержки IFileIsInUse.

Выводы

Интерфейс IFileIsInUse является хорошей идеей в теории, но на практике он не так полезен, если приложения не поддерживают его. Похоже, что многие популярные приложения не реализуют этот интерфейс.

В случае, если IFileIsInUse не реализован, необходимо использовать альтернативные механизмы для определения приложения, удерживающего блокировку файла. Например, можно использовать утилиту Process Explorer от SysInternals для поиска процессов, удерживающих файл.

Пример кода

function GetFileInUseInfo(const FileName: WideString): IFileIsInUse;
var
  ROT: IRunningObjectTable;
  mFile, enumIndex, Prefix: IMoniker;
  enumMoniker: IEnumMoniker;
  MonikerType: LongInt;
  unkInt: IInterface;
begin
  // Инициализация и работа с интерфейсами COM...
  // ...
end;

Этот код является лишь шаблоном и должен быть дополнен соответствующими проверками и обработкой возможных ошибок. Также, при работе с COM интерфейсами важно помнить о необходимости освобождения интерфейсов, чтобы избежать утечек памяти.

Заключение

Для решения задачи определения, используется ли файл и каким приложением, в среде Delphi и на платформе Windows 7, можно использовать функцию GetFileInUseInfo. Однако, если приложение не поддерживает IFileIsInUse, следует искать альтернативные подходы, такие как использование утилит для анализа процессов.

Создано по материалам из источника по ссылке.

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


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




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


:: Главная :: API реализация ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-06-16 01:45:57/0.0032880306243896/0