CreateProcess nie działa

0

Jeżeli próbuje uruchomić aplikację w taki sposób:

 CreateProcess(nil,PChar(ExtractFilePath(Application.ExeName)+'test.exe'),nil,nil,false,NORMAL_PRIORITY_CLASS,nil,nil,SI,PI) ;

to wyskakuje mi taki błąd:
Aplikacja nie została właściwie zainicjowana (0xc0000005). Kliknij przycisk OK, aby zakończyć aplikację.

Jeżeli próbuje tego samego podając ręcznie ścieżkę bez ExtractFilePath(Application.ExeName) to żadnego błędu nie ma.

CreateProcess(nil,PChar('C:\test.exe'),nil,nil,false,NORMAL_PRIORITY_CLASS,nil,nil,SI,PI) ; 

Co robię źle?

0

A wyświetl sobie ExtractFilePath(Application.ExeName)+'test.exe'. Obstawiam, że brakuje '' pomiędzy katalogiem a 'test.exe'.

0

Wyświetliłem sobie i jest!
Przecież jakby tam nie było tego '' to by nie wyświetliła się informacja że aplikacja została źle zainicjowana.

0

Dodam jeszcze że po nazwie aplikacji piszę parametry z jakimi ma się uruchomic aplikacja i tak to wygląda
PChar('C:\test.exe -parametr1'); --tak działa
PChar(ExtractFilePath(Application.ExeName)+'test.exe -parametr1'); -- tak nie działa

0

Wydaje mi się że źle tworzysz ten PChar (kiedyś miałem z tym problemy), spróbuj tym kodem:

function To_PChar(const s:ansistring):PChar;
begin
        To_PChar:=StrAlloc(length(s)+1);
        StrPCopy(To_PChar,s);
end;
procedure Free_PChar(var p:PChar);
begin
        if p<>nil then StrDispose(p);
end;

Z tego co wiem, musisz dodać moduł strutils.
Zresztą, skoro znalazłeś buga, to co Ci na to poradzimy?

0

Najprościej to chyba będzie tak, a przynajmniej ja tak robiłem i wszystko mi działa ok:

procedure ExecNewProcess(ProgramName : string; CmdShow : LongWord);
var
  SI : TStartupInfo;
  PI : TProcessInformation;
begin
  ZeroMemory(@SI, SizeOf(SI));
  SI.cb := SizeOf(SI);
  SI.dwFlags := STARTF_USESHOWWINDOW;
  SI.wShowWindow := CmdShow;
  CreateProcess(nil, PChar(ProgramName), nil, nil, False, 0, nil, nil, SI, PI);
end;

W ProgramName może być ściekza + nazwa exeka + parametry (po spacji). Drugi parametr dla tej procedury możesz dac SW_SHOW, a jeśli chcesz aby uruchomiło się w ukrytym oknie to SW_HIDE.

1 użytkowników online, w tym zalogowanych: 0, gości: 1