Использование Delphi ShellExecute () с процессом, наследующим исходную консоль? - PullRequest
1 голос
/ 08 апреля 2010

В Си я раньше использовал функцию system() в консольном приложении, и если я запускаю другой процесс, используя system(), он наследует окно консоли процесса, который его вызвал.

В Delphi system() не существует, поэтому я использую ShellExecute() для создания нового процесса, но новый процесс появляется в новом окне консоли. Есть ли способ, которым я могу заставить его наследовать дескриптор окна, которое его вызывает?

Я использовал

function GetConsoleWindow(): HWND; stdcall; external 'kernel32.dll';

чтобы получить окно консоли и передать его в HWND части ShellExecute(), но это не сработало.

1 Ответ

5 голосов
/ 08 апреля 2010

Используя ShellExecute(), вы не сможете заставить порожденное приложение использовать ту же консоль. Элемент HWND в вызове ShellExecute() задокументирован:

Определяет родительское окно. Это окно получает любые сообщения, которые генерирует приложение. Например, приложение может сообщить об ошибке, создав окно сообщения.

, поэтому он не будет иметь никакого эффекта для консольных приложений.

Если вы используете CreateProcess(), то у вас гораздо больше контроля над порожденным процессом. Используя параметр dwCreationFlags, вы можете заставить новый процесс получить собственную консоль (используйте флаг CREATE_NEW_CONSOLE), но по умолчанию он наследует консоль родительского процесса. *

...