Как закрыть приложение, используя HINSTANCE - PullRequest
1 голос
/ 20 мая 2011

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

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

Ответы [ 2 ]

3 голосов
/ 20 мая 2011

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

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

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

1 голос
/ 20 мая 2011

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

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

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

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

Тогда, если все они не смогут выйти, позвоните TerminateProcess.

...