Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.10.05;
Скачать: CL | DM;

Вниз

OpenSaveDialog и CreateProcess   Найти похожие ветки 

 
Elec3C ©   (2007-11-04 20:05) [0]

Есть небольшая проблемка.

Сначала код:
Запуск приложений(OpenDlg : TKOLOpenSaveDialog):
...
 progs : array[0..1] of String;
...
procedure(FileName : String);
var
 FileName : String;//Имя и путь запускаемой программы
 SI       : _STARTUPINFOA;
 PI       : _PROCESS_INFORMATION;
begin
 ZeroMemory(@SI, SizeOf(_STARTUPINFOA));
 ZeroMemory(@PI, SizeOf(_PROCESS_INFORMATION));

 with SI, PI do
  begin
    cb          := SizeOf(_STARTUPINFOA);
    dwFlags     := STARTF_USESHOWWINDOW;
    wShowWindow := SW_SHOWNORMAL;

    CreateProcess(nil, PChar(FileName), nil, nil, False, NORMAL_PRIORITY_CLASS,
       

         nil,             nil,  SI,  PI);

    CloseHandle(hProcess);  CloseHandle(hThread);   CloseHandle(hStdError);
    CloseHandle(hStdInput); CloseHandle(hStdOutPut);
  end;
end;
...
Путь и имя запускаемой 1-ой программы:
...
OpenDlg.Title  := "Программа";
OpenDlg.Filter := "Программа (*.exe)|*.exe";
if OpenDlg.Execute then
progs[0] := OpenDlg.Filename;
...
Путь и имя запускаемой 2-ой программы:
...
OpenDlg.Title  := "Программа";
OpenDlg.Filter := "Программа (*.exe)|*.exe";
if OpenDlg.Execute then
progs[1] := OpenDlg.Filename;
...

Описание проблемы:
Указываю путь и имя 1-ой программы в OpenDlg(например "F:\Games\Quake 3\Quake3.exe").
Пробую запустить 1-ую программу(Успешно). Закрываю Quake. Указываю путь и имя 2-ой

программы(например "F:\Games\CS\CS.exe"). Пробую запустить 2-ую программу(Успешно).
Затем пытаюсь запустить 1 программу, quake3(в моём примере) пытается грузится
не с "F:\Games\Quake 3\"(хотя в progs[0] указан "F:\Games\Quake 3\Quake3.exe"),
а с "F:\Games\CS\". В итоге quake 3 не запускается(такое происходить не только с

Quake"ом). Подскажите в чём может быть проблема?


 
Compiler ©   (2007-11-04 21:40) [1]

Может быть воспользоваться функцией ShellExecute(0,"open",pchar(filename),nil,nil,SW_SHOWNORMAL);
и по-моему reateProcess(PChar(FileName), nil,...


 
Elec3C ©   (2007-11-05 00:12) [2]


> и по-моему reateProcess(PChar(FileName), nil,...

Так пробовал - не помогает!
А через CreateProcess?


 
Elec3C ©   (2007-11-05 00:32) [3]

C ShellExecute тоже ничего не выходит(


 
Vladimir KladovVladimir Kladov   (2007-11-05 08:15) [4]

А где те строчки, которые используют p[0] и p[1]? Можно ведь вместо вызова программы просто сделать ShowMessage, чтобы просто убедиться, сделать наконец остановку, посмотреть значения переменных. Не верю, что виноват диалог. Рзве только выставлена опция multi0select и Filename перед вызовом не стираете, но это задокументировано.


 
Вячеслав   (2007-11-05 15:30) [5]


CreateProcess( lpApplicationName, lpCommandLine, lpProcessAttributes, lpThreadAttributes, bInheritHandles, dwCreationFlags, lpEnvironment, lpCurrentDirectory, lpStartupInfo, lpProcessInformation);
lpCurrentDirectory
Points to a null-terminated string that specifies the current drive and directory for the child process. The string must be a full path and filename that includes a drive letter. If this parameter is NULL, the new process is created with the same current drive and directory as the calling process. This option is provided primarily for shells that need to start an application and specify its initial drive and working directory.



> Указываю путь и имя 1-ой программы в OpenDlg(например "F:
> \Games\Quake 3\Quake3.exe").
> Пробую запустить 1-ую программу(Успешно). Закрываю Quake.

OpenDlg изменяет каталог на "F:\Games\Quake 3"
При вызове CreateProcess lpCurrentDirectory не указана значит будет использоватся текущий каталог.

>  Указываю путь и имя 2-ой
> программы(например "F:\Games\CS\CS.exe"). Пробую запустить
> 2-ую программу(Успешно).

OpenDlg изменяет каталог на "F:\Games\CS"

> Затем пытаюсь запустить 1 программу, quake3(в моём примере)
> пытается грузится
> не с "F:\Games\Quake 3\"(хотя в progs[0] указан "F:\Games\Quake
> 3\Quake3.exe"),
> а с "F:\Games\CS\". В итоге quake 3 не запускается(такое
> происходить не только с
Quake"ом). Подскажите в чём может быть проблема?

Quake при запуске сам не меняет каталог. Но пытается открыть ресурсы расположенные в ТЕКУЩИЙ КАТАЛОГ\Base\*.pk3. А так как в текущий каталог это "F:\Games\CS\" то найти своих ресурсов он там не может и валится с ошибкой.

Наверно надо как-то так:
CreateProcess(nil, PChar(FileName), nil, nil, False, NORMAL_PRIORITY_CLASS,
nil, PChar(ExtractFilePath(prog[0]),  SI,  PI);


 
Elec3C ©   (2007-11-05 17:10) [6]

Лекарство от Вячеслава помогло. Спасибо.



Страницы: 1 вся ветка

Текущий архив: 2008.10.05;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.016 c
15-1218831455
_koha
2008-08-16 00:17
2008.10.05
Народ как достать RAD STUDIO


15-1218782116
Dennis I. Komarov
2008-08-15 10:35
2008.10.05
Вопросик по сетке


8-1185268687
s7r
2007-07-24 13:18
2008.10.05
Странная проблема с GDI+


9-1173275349
ElectriC
2007-03-07 16:49
2008.10.05
DirectX движок


2-1219594068
TStas
2008-08-24 20:07
2008.10.05
Глюк дельфей в консольном приложении