![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
|
|
#1
|
||||
|
||||
|
Всем привет! Ребята, я делаю Ланчер для игры, не знаю как отследить ее завершение и сделать определенные действия после этого.
При нажатии на кнопку в виртуальный привод монтируется образ диска, потом игра запускается, я для этого использовал функцию ShellExecute (не уверен, правильно ли это, но главное работает). Теперь мне нужно что бы Ланчер отследил завершение игры и размонтировал образ... делаю примерно так: Код:
ShellExecute(0, nil, 'c:\program files\daemon tools lite\dtlite.exe', PChar('-mount dt, 0, "d:\games\mygame\img\mygame.cue"'), nil, SW_HIDE);
ShellExecute(0, nil, Pchar(ExtractFilePath(Application.ExeName)+'mygame.exe'),PChar(Keys), nil, SW_RESTORE);Как отследить завершение процесса, при этом чтоб программа не грузила процессор а тихо сидела и ждала в памяти...? Заранее спасибо! |
|
#2
|
||||
|
||||
|
CreateProcess, WaitForSingleObject
|
| Этот пользователь сказал Спасибо NumLock за это полезное сообщение: | ||
Alloc (18.05.2015)
| ||
|
#3
|
||||
|
||||
|
А можно и так, по drkb
Код:
Var
exInfo: TShellExecuteInfo;
Begin
FillChar( exInfo, Sizeof(exInfo), 0 );
With exInfo Do Begin
cbSize:= Sizeof( exInfo ); // required!
fMask := SEE_MASK_NOCLOSEPROCESS;
Wnd := Handle; // forms handle
lpVerb:= 'paintto';
lpFile:= Pchar( pdffilename );
lpParameters := PChar( printernameAndPort );
nShow := SW_HIDE;
End;
If ShellExecuteEx( @exInfo ) Then Begin
While GetExitCodeProcess( exinfo.hProcess, exitcode )
and (exitcode = STILL_ACTIVE)
Do
Sleep( 500 );
CloseHandle( exinfo.hProcess );
DeleteFile( pdffilename );
End
Else
ShowMessage(SysErrorMessage( GetLastError )); |
| Этот пользователь сказал Спасибо Alegun за это полезное сообщение: | ||
Alloc (18.05.2015)
| ||
|
#4
|
||||
|
||||
|
Спасибо за подсказки.
Нашел в интернете небольшой код который мне подходит. Так как мои познания в программировании пока не столь значимы, я прошу вас мне помочь немного подредактировать ниже следующий код.. после запуска второго приложения - первое ждет когда оно завершится и при этом зависает когда с ним взаимодействуешь.. как этого избежать? Код:
function StartFileAndWait(CommandString: string): boolean; //âõîä - êîìàíäà çàïóñêà
var
si: TStartupInfo;
pi: TProcessInformation;
begin
Result := False;
ZeroMemory( @si, sizeof( si ) );
si.cb := SizeOf( si );
if not CreateProcess( nil, // No module name (use command line).
PChar( CommandString ), // Command line.
nil, // Process handle not inheritable.
nil, // Thread handle not inheritable.
False, // Set handle inheritance to FALSE.
0, // No creation flags.
nil, // Use parent's environment block.
nil, // Use parent's starting directory.
si, // Pointer to STARTUPINFO structure.
pi ) // Pointer to PROCESS_INFORMATION structure.
then
begin
result:=false;
Exit;
end;
WaitForSingleObject( pi.hProcess, INFINITE );
CloseHandle( pi.hThread );
CloseHandle( pi.hProcess );
Application.BringToFront;
Result := True;
end;
procedure TForm1.btn1Click(Sender: TObject);
begin
if StartFileAndWait('cmd.exe') then ShowMessage('Process terminated');
end;Заранее спасибо! |
|
#5
|
||||
|
||||
|
WaitForSingleObject в отдельном потоке...
|
| Этот пользователь сказал Спасибо NumLock за это полезное сообщение: | ||
Alloc (18.05.2015)
| ||
|
#6
|
||||
|
||||
|
Цитата:
если б я знал как это сделать... не поможете? |