Как закрыть приложение, используя 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 у вас не заслуживает доверия, не говоря уже о бесполезности...