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

Тема в разделе "Delphi - FAQ", создана пользователем Oleg123, 17 дек 2003.

Статус темы:
Закрыта.
  1. Oleg123

    Oleg123 Гость

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

    ???? Гость

    Oleg123
    Вот почитай:
    Код (Text):
    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 по использованию:

    Код (Text):
    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 не дружу, поэтому переделаешь сам или помогут другие. Где копать я тебе показал. Дерзай.
     
  3. admin

    admin Well-Known Member

    Регистрация:
    8 авг 2003
    Сообщения:
    2.811
    Симпатии:
    0
    Для делфи
    Код (Text):
    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;
    Описалово тоже самое.
     
  4. Vagor.ini

    Vagor.ini Гость

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

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

    Код (Text):
    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;
     
Загрузка...
Статус темы:
Закрыта.

Поделиться этой страницей