кто или что использует файл?

Общие вопросы, не зависящие от языка реализации.

Модераторы: Duncon, Hawk, Romeo, Eugie

Ответить
Nebel
Сообщения: 5
Зарегистрирован: 18 мар 2004, 09:11
Откуда: Москва

18 мар 2004, 09:26

Может кто знает как определить какая программа использует файл. Т.е. если txt файл открыт в блокноте то шо бы прога сообщила файл открыт в проге такой-то. Или может кто знает где это описано...
Знай, ты можешь...
Аватара пользователя
Naeel Maqsudov
Сообщения: 2551
Зарегистрирован: 20 фев 2004, 19:17
Откуда: Moscow, Russia
Контактная информация:

19 мар 2004, 10:12

Не всегда это возможно в принципе.
Если файл открыт в блокноте, то блокнот не держит этот файл, и соответственно никто об этом не узнает.
Nebel
Сообщения: 5
Зарегистрирован: 18 мар 2004, 09:11
Откуда: Москва

19 мар 2004, 13:38

мда...хм... а в проге TaskInfo почему-то все видно... может это где в реестре прописывается... или hook'и ставить... если есть любые идени пишите...
Знай, ты можешь...
Eugie
Сообщения: 707
Зарегистрирован: 17 фев 2004, 23:59
Откуда: SPb

19 мар 2004, 16:21

Цель вопроса не вполне понятна.

Если нужно узнать, какая программа по умолчанию открывает файл с заданным расширением (file assoсiation), используй FindExecutable или AssocQueryString, например:

Код: Выделить всё

if (FindExecutable("mydoc.txt", NULL, szExeFile) > 32)
  cout << ".txt files are assosiated to open with " << szExeFile << endl;
Если же вопрос в том, кто в данный момент владеет конкретным файлом (скажем, по хэндлу файла получить хэндл процесса, в контексте которого он открыт), то лично я такого способа не знаю. И сомневаюсь, что он существует, поскольку отношение 'файл-процесс' неоднозначно по определению: файл м.б. открыт одновременно несколькими процессами.
мда...хм... а в проге TaskInfo почему-то все видно...
Не знаю, не использовал.
если есть любые идени пишите...
Нет, ну можно, конечно, пробежаться по заголовкам всех главных окон... :)
Аватара пользователя
Romeo
Сообщения: 3091
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

25 мар 2004, 12:45

Нужно получить объект IDataObject, ассоциированный с этим файлом, а потом вызвать у этого объекта метод EnumDAdvise, который позволяет перечислить все Advise Connections этого файла. Вот и всё. Подробности, как всегда, в MSDN :)
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Eugie
Сообщения: 707
Зарегистрирован: 17 фев 2004, 23:59
Откуда: SPb

26 мар 2004, 00:06

Romeo, приветствую!

После изучения MSDN cоглашусь только с последней фразой :) Насколько я понял, IDataObject используется в основном для поддержки дрыг-эн-драп под Шелл. А вопрос был узнать, какой процесс открыл файл. Просвети, если я не прав. Примерчик в студию :)
Аватара пользователя
Romeo
Сообщения: 3091
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

26 мар 2004, 15:57

Eugie, зачем же два раза? :D Прав целиком, не спорю. Видишь как полезно бывает не совсем корректное высказывание. Сколько ты нового почерпнул из необъятный дебрей MSDN :)
Eugie
Сообщения: 707
Зарегистрирован: 17 фев 2004, 23:59
Откуда: SPb

26 мар 2004, 16:17

Это не я, чесслово :lol: Рука дрогнула - форум взглюкнул :o
Аватара пользователя
Romeo
Сообщения: 3091
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

26 мар 2004, 16:27

Ладно, ладно, верю... :) А относительно IDataObect я дейсвительно поспешил с выводами. Он используется для передачисистемных item'ов (т.е. файлов, директорий или виртуальных папок) между шелом и приложением. В частности, как совершенно верно было замечено тобой, - для реализации drug-and-drop...
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Ответить