Главная страница
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.015 c
3-1206800178
srgsoroka
2008-03-29 17:16
2008.10.05
зависание при запуске с расшаренного диска


15-1218022106
Palladin
2008-08-06 15:28
2008.10.05
Покупка Delphi 6


15-1219010733
No_Dead(w)
2008-08-18 02:05
2008.10.05
монитор не выключается%)


15-1219047498
vajo
2008-08-18 12:18
2008.10.05
Можно апгрейдить Vista Business до 2008 Server?


2-1219826998
demon
2008-08-27 12:49
2008.10.05
Горячие клавиши