![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
||||
|
||||
|
Здравствуйте!
Делаю ланчер для игры. При нажатии на кнопку "Play" по идее должен запускаться Daemon Tools с параметрами для загрузки образа, после чего должна запускаться сама игра. Делаю так: Код:
procedure TForm1.btn1Click(Sender: TObject);
begin
ShellExecute(0, nil, Pchar(DTLiteDir),PChar('-mount dt, "'+ExtractFilePath(Application.ExeName)+'img\mygame.cue"'), nil, SW_RESTORE);
ShellExecute(0, nil, Pchar(ExtractFilePath(Application.ExeName)+'MyGame.exe'),PChar(Keys), nil, SW_RESTORE);
end;проблема в том, что образ не всегда успевает загружаться, как игра стартует.. Подскажите как решить эту задачу. Может быть зациклить функцию на сканирование CD-ROM'ов и пока не загрузится не запускать саму игру... может быть есть другие способы проверить... как лучше и логичнее сделать? |
|
#2
|
||||
|
||||
|
CreateProcess & WaitForSingleObject >>= Google.
|
| Этот пользователь сказал Спасибо M.A.D.M.A.N. за это полезное сообщение: | ||
Alloc (25.05.2015)
| ||
|
#3
|
||||
|
||||
|
Спасибо за подсказку. А как быть если я запускаю игру через командную строку, вот так:
Код:
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;Код:
if StartFileAndWait(DTLiteDir+' -mount dt, "'+ExtractFilePath(Application.ExeName)+'img\mygame.cue"') then
if StartFileAndWait('cmd.exe /c start /affinity 1 /d '+'"'+ExtractFileDir(Application.ExeName)+'MyGame.exe "'+'"'+Keys+"') then
ShowMessage('Программа закрыта');если я сделаю так то программа будет ждать завершения не "MyGame.exe" а "cmd.exe"... как решить задачу? Заранее спасибо. Последний раз редактировалось Alloc, 25.05.2015 в 12:18. |
|
#4
|
||||
|
||||
|
Код:
if StartFileAndWait(DTLiteDir+' -mount dt, "'+ExtractFilePath(Application.ExeName)+'img\mygame.cue"') and StartFileAndWait('cmd.exe /c start /affinity 1 /d '+'"'+ExtractFileDir(Application.ExeName)+'MyGame.exe "'+'"'+Keys+"') then
ShowMessage('Программа закрыта'); |
| Этот пользователь сказал Спасибо M.A.D.M.A.N. за это полезное сообщение: | ||
Alloc (25.05.2015)
| ||
|
#5
|
||||
|
||||
|
спасибо, я попробую
|
|
#6
|
||||
|
||||
|
скажите пожалуйста, я вот пытаюсь как то обработать результат выполнения моего кода... скажите я правильно делаю и что можно исправить в этом коде?
Код:
procedure TForm1.PlayGameClick(Sender: TObject);
var
i: integer;
CDFix: boolean;
begin
if chk4.checked then
begin
i:=0;
CDFix:= false;
while CDFix = true do
begin
if ExtractRes('EXEFILE','devcon', ExtractFilePath(Application.ExeName)+'devcon.exe') and
StartFileAndWait(ExtractFilePath(Application.ExeName)+'devcon.exe disable *cdrom*') then
begin
CDFix:= True;
i:=0;
Break;
end else
begin
i:=i+1;
CDFix:= False;
if i=10 then
begin
lbl2.caption:= 'Не удалось отключить физический привод!';
Exit;
end;
end;
end;
StartFileAndWait('cmd.exe /c start /affinity 1 /d '+'"'+ExtractFileDir(Application.ExeName)+'MyGame.exe "'+'"'+Keys+"')
end;заранее спасибо! Последний раз редактировалось Alloc, 26.05.2015 в 11:47. |