Как закрыть приложение, используя HINSTANCE

Я порождаю приложение из C++ с ShellExecute, поэтому у меня есть HINSTANCE приложения.

Как я могу закрыть его сейчас, используя это HINSTANCE? И можно ли использовать WaitForSingleObject(), чтобы дождаться завершения приложения?

2 ответа

Решение

Прежде всего, HINSTANCE имеет очень мало пользы в современных версиях Windows - но то, что у вас есть, на самом деле не HINSTANCE тем не мение. Возвращение из ShellExecute на самом деле просто значение больше или меньше 32, чтобы указать успех или неудачу соответственно.

К счастью, если вы используете ShellExecuteExвы можете получить дескриптор процесса для нового процесса, и вы можете использовать его для управления процессом.

Статья MSDN, которую связывает @Remus, является приличной, но (IMO) есть еще один шаг, который может быть полезен, если целевое приложение является (или может быть) консольным приложением. В этом случае он обычно не справится с WM_CLOSE сообщение. Вы можете, однако, внедрить DLL в процесс, и сделать это, чтобы сделать чистое (ish) отключение изнутри процесса (например, если он вызывает exitи целевая программа написана на C, она получит возможность сбрасывать и закрывать файлы, запускать все, что зарегистрировано в atexitи т. д. перед смертью).

Если это не удается, вы можете использовать GenerateConsoleCtrlEvent послать ему контрольный перерыв.

Затем, если все те не в состоянии выйти, вы звоните TerminateProcess,

Нет способа изящно завершить процесс. Существует неожиданный и изящный способ с помощью TerminateProcess, но это не позволит процессу запускать собственный код очистки и может оставить вещи "в подвешенном состоянии", см. " Краткий обзор выхода процессов из Windows XP".

В течение долгого времени распространенной мудростью в отношении "прекращения процесса" было посылать WM_CLOSE в самые верхние неиспользуемые окна процесса, ожидая, что приложение ответит корректным завершением работы. См. Как завершить приложение "Чисто" в Win32, а также это обязательное чтение по соответствующей теме поиска правильного окна: может быть несколько (или ноль): преобразование процесса в окно

Также вы должны прочитать, что я могу сделать с HINSTANCE, возвращаемым функцией ShellExecute? чтобы понять, почему HINSTANCE у вас не заслуживает доверия, не говоря уже о бесполезности...

Другие вопросы по тегам