Delphi - Delphi: как закрыть чужую прогу

Аватара пользователя
vasketsov

Re: Delphi - Delphi: как закрыть чужую прогу

Сообщение vasketsov »

mj


Цитата:



Малоли чё где написано, это ведь не я придумал, а Borland, они та моумней тебя... А по поводу того что написано на msdn.microsoft.com: так на заборе тоже много чё пишут...



То есть, весь мир (включая M$) под M$ пишет неправильно, один борланд правильно? Кстати, откуда этот кусок, что ты на борланд ссылаешься? Попробуй взять кусок кода, открывающий/убивающий процесс/закрывающий его и натравить на процесс, запущенный из Delphi из-под отладчика (в этом случае как рз процесс для системы будет подвешен на примитиве синхронизации типа Event). Возьми HandleEx или аналог с сайта sysinternals от Руссиновича и смотри, как у тебя будет расти количество открытых хэндлов на процесс, открыть ты его сможешь, а закрыть - нет.




Цитата:



В любом случае это самый безопасный метод



Метод можно рассматривать как безопасный или как небезопасный только после того, как он становится рабочим. Если у программы нет понятия главного окна (например, Explorer, запущенный не как Shell и с отключенной опцией создавать для отдельного окна процесс) - ее таким образом не закрыть до закрытия последнего окна либо даже не закрыть совсем (смотря как писать обработчик сообщений и какой критерий завершения программы в этом случае выбрать, просто "нет открытых окон" не всегда корректный критерий для такого случая).
Аватара пользователя
RealRascal

Re: Delphi - Delphi: как закрыть чужую прогу

Сообщение RealRascal »

Здрасьте! А как, глубокоуважаемые, Вы найдете и уничтожите программу у которой нет(допустим, на данный момент нет, или вообще нет) окна? Что если окна в целях экономии ОЗУ создаются, а потом уничтожаются? А вдруг где-нибудь, глубоко в оперативке, сидит себе злобное безоконное приложение и ждет своего часа?
Аватара пользователя
RealRascal

Re: Delphi - Delphi: как закрыть чужую прогу

Сообщение RealRascal »

vasketsov



Не подскажешь?



Ситуация: служба создает процесс (пресловутый Notepad),

dwCreationFlags: NORMAL_PRIORITY_CLASS



StartupInfo.dwFlags:=STARTF_USESHOWWINDOW;

StartupInfo.wShowWindow:=SW_SHOW;



Процесс запускается, но без GUI. И при попытке убить процесс с помощью диспетчера задач : "Операция не может быть завершена. Отказано в доступе."



В чем дело? Спасибо.
Аватара пользователя
vasketsov

Re: Delphi - Delphi: как закрыть чужую прогу

Сообщение vasketsov »

Guest

1) Почему не видно окна. Служба помечена как неинтерактивная, она запускает notepad в рамках системной оконной станции, которая не видна вошедшему пользователю. Для того, чтобы notepad появлялся, надо либо службе разрешить взаимодействие с рабочим столом, либо, если это своя служба и не хочется ее делать интерактивной, научить создавать процесс на конкретном рабочем столе конкретной оконной станции. Необходимая информация есть в msdn в описании функций CreateProcess (и SetProcessWindowStation с SetThreadDesktop, если хочется уметь переключать процесс с одного рабочего стола на другой).



2) Почему не завершается. Для завершения такого процесса необходимо получить привилегии отладки. Как это делается, уже вроде бы писалось, в любом случае искать надо функцию AdjustTokenPrivileges либо здесь, либо в msdn.microsoft.com. Можно еще попробовать использовать RtlAdjustPrivilege, пример находится здесь внизу:
http://ntprog.by.ru/_rtl.htm
Ответить

Вернуться в «Программирование и базы данных»