![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как по известному Handle программы узнать её расположение на диск
acsoft © (2004-10-16 10:23:00)Вообще задача у меня такая - я знаю имя файла программы, надо обновления периодически загружать. Так вот, если я это обновление загрузил, мне его надо на место старой проги поставить, а старая прога может работать. Надо значит выключить старую и уже потом поверх записать новую версию.
Я думаю так - опросить все Handle'ы запущенных приложений и если соответствующая программа установлена по известному мне адресу, то послать Message на закрытие.
Вообщем, как по известному Handle программы узнать её расположение на диске, ну в смысле имя файла?
Или может можно как-нибудь поэлегантнее? Только надо чтобы замена происходила сразу, вариант с прописыванием в HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\RunOnce строки 'command.com /c del FILENAME.EXE' и тому подобное не катит - нет времени ждать перезагрузки винды.
acsoft (2004-10-16 13:29:00) [1]Ага, спасибо, все супер.
Правда только с десятого раза дошло, что вместо
OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ,False,PIDArray[I]);в моем случае надо
OpenProcess(PROCESS_ALL_ACCESS, False, PIDArray[i]);
Ладно, вроде пашет...
DVM (2004-10-16 12:16:00) [2]http://delphiworld.narod.ru/base/is_exe_running.html
acsoft (2004-10-16 12:14:00) [3]Да, неправильно выразился.
Проблема в том, что приложение без окна - объяснять юзеру, что надо открывать Диспетчер, искать процесс... Да не, проблема с потерей данных это другая проблема.
Хорошо а как перебрать процессы, как найти именно мою программу? Есть, положим, такая-то программа, я знаю её имя файла - как её найти в процессах?
DVM (2004-10-16 12:05:00) [4]
> Вообщем, как по известному Handle программы узнать её расположение
> на диске, ну в смысле имя файла?
Никак, потому как у программ хэндлов нет.
> Я думаю так - опросить все Handle'ы запущенных приложений
> и если соответствующая программа установлена по известному
> мне адресу, то послать Message на закрытие.
Можно перебрать все запущенные процессы и выделить нужный, можно перебрать окна и найти нужное, но Message послать можно только окну. Убить процесс - TerminateProcess().
А по-моему проще так: если удалить файл программы не получается, то она запущена - выдаем сообщение юзеру, чтобы закрыл ее. А то убивать - закрывать без предупреждения чревато потерей данных.