• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

    На последнюю неделю приходится экзамен, где нужно будет показать свои навыки, взломав ряд уязвимых учебных сайтов, и добыть флаги. Успешно сдавшие экзамен получат сертификат.

    Запись на курс до 25 апреля. Получить промодоступ ...

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

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

Oleg123

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

????

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

admin

Для делфи
Код:
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

Присоединяюсь к ???? и Сереге по поводу использования 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;
 
Статус
Закрыто для дальнейших ответов.
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!