![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
CreateProcess консольной программы [D7, WinXP]
Вольный Стрелок © (2006-11-23 18:37:00)Из одной консольной программы вызываю другую и хочу, чтобы "консоль" для них была общая, а не отдельное окно для вызванной программы. Какие параметры установить надо?
ЗЫ вызываемая программа - посторонняя, есть только ЕХЕ
Вольный Стрелок (2006-11-28 11:03:00) [1]Так, ясно...
Как только сказал, что получилось, все резко потеряли интерес к теме...
Вольный Стрелок (2006-11-27 18:32:00) [2]Rouse_ © (24.11.06 10:52) [7]
> В саправке так и написано что использовать ее нельзя?
И если уж совсем придираться :)
то фраза из справкиApplications shoulduseозначает настоятельную рекомендацию, ну очень близкую к обязательному требованию.
Вольный Стрелок (2006-11-27 18:28:00) [3]Rouse_ © (27.11.06 18:09) [10]
Допустим, хотя почему с тем же CreateProcess нету таких фиговин?
А что скажешь про неживость после окончания? Ожидает ведь проезда мышей над окном, тогда "впрыгивает" назад в фар (завершается процесс). Специально ничего такого не делал.
Вольный Стрелок (2006-11-27 18:23:00) [4]BiN © (27.11.06 17:50) [9]
Заработало, спасибо.
Хотя не пойму, почему мой вариант не катит :(
Ведь в справке написано:
lpApplicationName
Pointer to a null-terminated string that specifies the module to execute.
The string can specify filename of the module to execute. The specified module can be a Win32-based application. It can be some other type of module (for example, MS-DOS or OS/2) if the appropriate subsystem is available on the local computer. Windows NT: If the executable module is a 16-bit application, lpApplicationName should be NULL, and the string pointed to by lpCommandLine should specify the executable module.
Проверил TDump'ом вызываемый EXE. Требуемая версия винды - 4.
Как определить, 16 или 32-битное приложение?
Rouse_ (2006-11-27 18:09:00) [5]
> Что я не учел?
Очитску экрана не произвел перед запуском. (это я про синие панельки)
BiN (2006-11-27 17:50:00) [6]
> Вольный Стрелок © (27.11.06 17:47) [8]
>
> Процесс не стартует, возвращает ошибку "Не удается найти
> указанный файл." Но:
> ...
> Однако WinExec с теми же параметрами (вызываемый следом)
> нормально стартует,
CreateProcess( nil, PChar( cAppName+' '+cCommandLine )...
Вольный Стрелок (2006-11-27 17:47:00) [7]BiN © (23.11.06 21:40) [5]
hStartupInfo.dwFlags := hStartupInfo.dwFlags or STARTF_USESTDHANDLES;
hStartupInfo.hStdInput := GetStdHandle( STD_INPUT_HANDLE );
hStartupInfo.hStdOutput := GetStdHandle( STD_OUTPUT_HANDLE );
hStartupInfo.hStdError := GetStdHandle( STD_OUTPUT_HANDLE );
if( CreateProcess( PChar( cAppName ), PChar( cCommandLine ), nil, nil,
False, 0, nil, nil, hStartupInfo, hProcInfo ) ) then
begin
WriteLn( 'Can''t start process.'#13#10'Reason: ' + GetSystemError() );
Exit;
end;
if( WaitForSingleObject( hProcInfo.hProcess, INFINITE ) = WAIT_FAILED ) then
begin
WriteLn( 'Process execution failed.' );
Exit;
end;
Правильно?
Процесс не стартует, возвращает ошибку "Не удается найти указанный файл." Но:
Rouse_ © (24.11.06 10:52) [7]
Однако WinExec с теми же параметрами(вызываемый следом) нормально стартует, правда если запускать из фара, то синие панели ползут по экрану вверх. А после окончания они восстанавливаются только если мышой наехать на окно. Иначе остается какая-то синяя пятнистость вперемежку с сообщениями моей (и вызываемой ею) программы.
Что я не учел?
Rouse_ (2006-11-24 10:52:00) [8]
> Я спрашивал про параметры, а не про функцию.
> Кроме того, в справке написано про winexec так
а ты попробуй прежде чем ворчать. В саправке так и написано что использовать ее нельзя?
Чапаев (2006-11-24 09:58:00) [9]> [0] Вольный Стрелок © (23.11.06 18:37)
AttachConsole? Сам не пробовал, сапогами не пинайте. Да и если сработает, то только в том случае, если вызываемая программа сама этого захочет. :-)
BiN (2006-11-23 21:40:00) [10]
> Вольный Стрелок ©
typedef struct _STARTUPINFO {
DWORD cb;
LPTSTR lpReserved;
LPTSTR lpDesktop;
LPTSTR lpTitle;
DWORD dwX;
DWORD dwY;
DWORD dwXSize;
DWORD dwYSize;
DWORD dwXCountChars;
DWORD dwYCountChars;
DWORD dwFillAttribute;
DWORD dwFlags;// or STARTF_USESTDHANDLES
WORD wShowWindow;
WORD cbReserved2;
LPBYTE lpReserved2;
HANDLE hStdInput;//= GetStdHandle(STD_INPUT_HANDLE)
HANDLE hStdOutput;//= GetStdHandle(STD_OUTPUT_HANDLE)
HANDLE hStdError;//= GetStdHandle(STD_OUTPUT_HANDLE)
} STARTUPINFO,
*LPSTARTUPINFO;
Вольный Стрелок (2006-11-23 20:05:00) [11]Я спрашивал про параметры, а не про функцию.
Кроме того, в справке написано про winexec так
This function is provided only for compatibility with 16-bit Windows. Applications should use the CreateProcess function.
так что вернулись к [0]
Rouse_ (2006-11-23 19:19:00) [12]WinExec вестимо...
Вольный Стрелок (2006-11-23 19:10:00) [13]Ну, как из фара вызывается консольная программа в том же окне.
Rouse_ (2006-11-23 18:58:00) [14]Консоль общая? Это как?