Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "KOL";
Текущий архив: 2008.10.05;
Скачать: [xml.tar.bz2];

Вниз

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 вся ветка

Форум: "KOL";
Текущий архив: 2008.10.05;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.46 MB
Время: 0.005 c
4-1194272170
kernel
2007-11-05 17:16
2008.10.05
spindown by DeviceIoControl


15-1218377553
Урсулапов
2008-08-10 18:12
2008.10.05
А почему пост про день рождения 9 августа не было?


15-1218421915
brother
2008-08-11 06:31
2008.10.05
посоветуйте внешний контроллер...


11-1194440952
=BuckLr=
2007-11-07 16:09
2008.10.05
Портированный DCPCrypt


15-1218679559
Slider007
2008-08-14 06:05
2008.10.05
С днем рождения ! 14 августа 2008 четверг





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский