Конференция "Начинающим" » Ошибки при запуске приложений из Delphi [D7, WinXP]
 
  • newbart (04.10.09 17:26) [0]
    Здравствуйте!
    Надо из моей программы запустить Блокнот с файлом tmp.txt, пишу такой код:
    var
     si: TStartupInfo;
     pi: TProcessInformation;
     CmdLine: String;
    begin
     CmdLine:= 'C:\WINDOWS\NOTEPAD.EXE c:\tmp.txt';

     FillChar(si, SizeOf(TStartupInfo), #0);
     si.cb:= SizeOf(TStartupInfo);
     si.dwFlags:= STARTF_USESHOWWINDOW;
     si.wShowWindow:= Windows.SW_SHOWNORMAL;

     CreateProcess(nil, PChar(CmdLine), nil, nil, False, NORMAL_PRIORITY_CLASS,
                   nil, nil, si, pi);
    end;



    Если программу запускать из Delphi, то вываливается на строке CreateProcess... с ошибкой в

    отладчик CPU.
    Если программу запускать НЕ из Delphi - все ОК.
    Что можно сделать?
    Спасибо.
  • Loginov Dmitry © (04.10.09 23:12) [1]
    > Если программу запускать из Delphi, то вываливается на строке
    > CreateProcess... с ошибкой в


    Ага. Тоже вылазит ошибка:
    DrWeb: D:\Program Files\Borland\Delphi7\Projects\Project1.exe - инфицирован Trojan.DownLoad.47164
    видимо не нравится, что программа вызывает функцию CreateProcess =))

    Ну а если серьезно, что за ошибка? Воспроизводится, если создать проект с нуля?
  • Riply © (05.10.09 05:31) [2]
    > [0] newbart   (04.10.09 17:26)
    > Что можно сделать?

    Для начала, попробуем Help почитать :)
    И гласит он следующее:
    lpCommandLine
    [in, out] The command line to be executed. The maximum length of this string is 32K characters.
    Windows 2000:  The maximum length of this string is MAX_PATH characters.
    The Unicode version of this function, CreateProcessW, can modify the contents of this string. Therefore, this parameter cannot be a pointer to read-only memory (such as a const variable or a literal string). If this parameter is a constant string, the function may cause an access violation.


    Тогда, пробуем "подогнать" наш вызов под его несуразные требования :)
    ("несуразные" - imho. Имею право на свое мнение:) )
    Пишем что-то такого типа:
    var
    si: TStartupInfo;
    pi: TProcessInformation;
    CmdLine: String;
    pCmdLine: PChar;
    begin
     inherited;
    CmdLine:= 'C:\WINDOWS\NOTEPAD.EXE c:\tmp.txt';
    pCmdLine := @CmdLine[1];
    FillChar(si, SizeOf(TStartupInfo), #0);
    si.cb:= SizeOf(TStartupInfo);
    si.dwFlags:= STARTF_USESHOWWINDOW;
    si.wShowWindow:= Windows.SW_SHOWNORMAL;

    if CreateProcess(nil, pCmdLine, nil, nil, False, NORMAL_PRIORITY_CLASS, nil, nil, si, pi) then
     begin
      ProcessInfo_CloseHandles(@pi);
      ShowMessage(pCmdLine);
     end
    else ShowMessage(SysErrorMessage(GetLastError));
    end;



    К моему великому удивлению ACCESS_VIOLATION исчезает :)
  • Юрий Зотов © (05.10.09 05:51) [3]
    > Riply ©   (05.10.09 05:31) [2]

    У него же D7, юникод тут вряд ли при чем. Этот же самый код у меня работает без проблем (D7, XP):

    procedure TForm1.FormDblClick(Sender: TObject);
    var
     si: TStartupInfo;
     pi: TProcessInformation;
     CmdLine: string;
    begin
     CmdLine := 'C:\WINDOWS\NOTEPAD.EXE c:\tmp.txt';
     ZeroMemory(@si, SizeOf(si));
     si.cb := SizeOf(si);
     if CreateProcess(nil, PChar(CmdLine), nil, nil, False, 0, nil, nil, si, pi) then
     begin
       CloseHandle(pi.hThread);
       CloseHandle(pi.hProcess)
     end
    end;

  • Riply © (05.10.09 06:20) [4]
    > [3] Юрий Зотов ©   (05.10.09 05:51)
    > У него же D7, юникод тут вряд ли при чем. Этот же самый код у меня работает без проблем (D7, XP)

    Во черт. Не заметила.
    Не если его код копипайстнуь в Delphi 2010, то получаем AV.
  • newbart (05.10.09 09:34) [5]
    Забыл сказать: ошибки только при запуска по User, под Admin - нет.
  • Юрий Зотов © (05.10.09 12:27) [6]
    > newbart   (05.10.09 09:34) [5]

    Нужен текст сообщения об ошибке.

    if Win32Check(CreateProcess(...)) then ...
  • MonoLife © (05.10.09 16:34) [7]

    > Надо из моей программы запустить Блокнот с файлом tmp.txt

    сорри, а shellexecute() не канает?
 
Конференция "Начинающим" » Ошибки при запуске приложений из Delphi [D7, WinXP]
Есть новые Нет новых   [134434   +30][b:0][p:0.001]