Задать вопрос

C++ Как открыть файл во внешнем приложении и гарантированно получить ID процесса?

Нужно из приложения написанного на C++ иметь возможность открывать файлы во внешних приложениях, получать ID процесса и отслеживать его закрытие. Как только файл закрывается выполнить некое действие.

Куда копать?
  • Вопрос задан
  • 5264 просмотра
Подписаться 3 Оценить 2 комментария
Пригласить эксперта
Ответы на вопрос 7
AxisPod
@AxisPod
В смысле надо взять notepad и открыть им файл, затем отследить закрытие notepad?

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

ID процесса можно получить используя CreateProcess, но большой подводный камень я описал выше. Более или менее вменяемый вариант озвучил Ramires, но опять же он наткнется на проблему с notepad++, вроде как можно было бы это отследить по имени процесса, но не все приложения так работают.
Ответ написан
@vScherba
По Windows могу предложить ShellExecuteEx, которая открывает файл в приложении по-умолчанию и возвращает hProcess. По hProcess можно ждать закрытия приложения. Но если Вам нужно отследить не закрытие приложения, а закрытие файла, тогда можно в цикле с некоторым Sleep пробовать открывать файл эксклюзивно, пока не получите успех.
Есть еще ReadDirectoryChangesW, но по-моему она не уведомляет об освобождении дескриптора файла.
Еще момент: есть такие приложения, которые не держат файлы открытыми, например если открыть текстовый файл блокнотом, то notepad считывает файл в память и сразу закрывает его, то есть не держит handle.
Ответ написан
Ramires
@Ramires
Как я понял, нет возможности влиять на внешнее приложение, надо как-то отследить факт закрытия файла после того, как мы запустили это приложение и скормили ему наш файл.
Возникла только одна идея — парсить вывод Handle v3.5 By Mark Russinovich (взято отсюда).
C Windows работал мало, надеюсь, кто-то подскажет что-то более изящное.
Ответ написан
Комментировать
@tbd
Если вам достаточно определить сам факт, что файл был изменён,
то на windows посмотрите в сторону «повесить хук на изменение файла»
вот ссылки для начала
how-do-i-make-my-program-watch-for-file-modification-in-c
Obtaining Directory Change Notifications
Ответ написан
Комментировать
sopov
@sopov Автор вопроса
AxisPod эта штука отслеживает именно изменения файла/каталога? или еще ждет его закрытия?
Ответ написан
sopov
@sopov Автор вопроса
Всем спасибо! Будем думать дальше. Спасибо за помощь +++
Ответ написан
Комментировать
m08pvv
@m08pvv
Так может отслеживать когда файл закроют? То есть когда его можно будет открыть на запись? Это избавит от описанной проблемы с приложениями типа notepad++.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы