Конференция "KOL" » OpenSaveDialog и CreateProcess [Delphi, Vista]
 
  • Elec3C © (04.11.07 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 © (04.11.07 21:40) [1]
    Может быть воспользоваться функцией
    ShellExecute(0,'open',pchar(filename),nil,nil,SW_SHOWNORMAL);


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

  • Elec3C © (05.11.07 00:12) [2]

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

    Так пробовал - не помогает!
    А через CreateProcess?
  • Elec3C © (05.11.07 00:32) [3]
    C ShellExecute тоже ничего не выходит(
  • Vladimir KladovVladimir Kladov (05.11.07 08:15) [4]
    А где те строчки, которые используют p[0] и p[1]? Можно ведь вместо вызова программы просто сделать ShowMessage, чтобы просто убедиться, сделать наконец остановку, посмотреть значения переменных. Не верю, что виноват диалог. Рзве только выставлена опция multi0select и Filename перед вызовом не стираете, но это задокументировано.
  • Вячеслав (05.11.07 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 © (05.11.07 17:10) [6]
    Лекарство от Вячеслава помогло. Спасибо.
 
Конференция "KOL" » OpenSaveDialog и CreateProcess [Delphi, Vista]
Есть новые Нет новых   [134431   +10][b:0][p:0.001]