Внешнее приложения через Winexec

  • Автор темы Oleg123
  • Дата начала
Статус
Закрыто для дальнейших ответов.
O

Oleg123

Гость
#1
Подскажите, как дождаться завершения внешнего приложения при использовании Winexec.
 
?

????

Гость
#2
Oleg123
Вот почитай:
Код:
WinExec
The WinExec function runs the specified application. 
Note This function is provided only for compatibility with 16-bit Windows. Applications should use the CreateProcess function.
Т.е. использование WinExec не является хорошим стилем программирования. Так-же WinExec не дает возможности "простого" отслеживания завершения порождаемого процесса. AFIAIK возможно извратиться и дождаться завершения, но это "не есть хорошо".

Лучше используй CreateProcess
Вот пример из MSDN по использованию:

Код:
void main( VOID )
{
 STARTUPINFO si;
 PROCESS_INFORMATION pi;

 ZeroMemory( &si, sizeof(si) );
 si.cb = sizeof(si);
 ZeroMemory( &pi, sizeof(pi) );

 // Start the child process. 
 if( !CreateProcess( NULL, // No module name (use command line). 
   "MyChildProcess", // Command line. 
   NULL,       // Process handle not inheritable. 
   NULL,       // Thread handle not inheritable. 
   FALSE,      // Set handle inheritance to FALSE. 
   0,        // No creation flags. 
   NULL,       // Use parent's environment block. 
   NULL,       // Use parent's starting directory. 
   &si,       // Pointer to STARTUPINFO structure.
   &pi )       // Pointer to PROCESS_INFORMATION structure.
 ) 
 {
   ErrorExit( "CreateProcess failed." );
 }

 // Wait until child process exits.
 WaitForSingleObject( pi.hProcess, INFINITE );

 // Close process and thread handles. 
 CloseHandle( pi.hProcess );
 CloseHandle( pi.hThread );
}
С Delphi не дружу, поэтому переделаешь сам или помогут другие. Где копать я тебе показал. Дерзай.
 

admin

Well-Known Member
08.08.2003
2 754
1
#3
Для делфи
Код:
function CreateProcess(lpApplicationName: PChar; lpCommandLine: PChar;
lpProcessAttributes, lpThreadAttributes: PSecurityAttributes;
bInheritHandles: BOOL; dwCreationFlags: DWORD; lpEnvironment: Pointer;
lpCurrentDirectory: PChar; const lpStartupInfo: TStartupInfo;
var lpProcessInformation: TProcessInformation): BOOL; stdcall;
Описалово тоже самое.
 
V

Vagor.ini

Гость
#4
Присоединяюсь к ???? и Сереге по поводу использования CreateProcess вместо WinExec. На дворе 2004 год почти, а смысл команды WinExec - это совместимость с ранними версиями Windows (всякие там win3.11, если помнишь:)

Ну а если по делу:
Функция вызываемая также, как и WinExec, но ожидающая завершение вызванного приложения. При успешном выполнении функция возвращает ноль.

Код:
function WinExecAndWait(Path: PChar; Visibility: Word): Word;
var
InstanceID: THandle;
Msg: TMsg;
begin
InstanceID := WinExec(Path, Visibility);
if InstanceID < 32 then { значение меньшее чем 32 указывает на ошибку запуска }
WinExecAndWait := InstanceID
else
repeat
while PeekMessage(Msg, 0, 0, 0, pm_Remove) do
begin
if Msg.Message = wm_Quit then Halt(Msg.WParam);
TranslateMessage(Msg);
DispatchMessage(Msg);
end;
until GetModuleUsage(InstanceID) = 0;
WinExecAndWait := 0;
end;
 
Статус
Закрыто для дальнейших ответов.