Frage

Createprocess () gibt false zurück, wenn der Kommandozeile ein path.I enthält verstehen nicht, warum.

ich den Betrieb hier vereinfacht:

function ExecProcess(path:string):boolean;
var StartupInfo:TstartupInfo;
    ProcInfo:TProcessInformation;
begin
  FillChar( StartupInfo, SizeOf( TStartupInfo ), 0 );
  StartupInfo.cb := SizeOf( TStartupInfo );
  Result:= CreateProcess(nil, PChar(path), Nil, Nil, False, 0, Nil,     PChar(ExtractFilePath(path)),StartupInfo,ProcInfo);
end;

begin
  ExecProcess(ParamStr(0) + ExtractFilePath(ParamStr(0)));
end.

Das Ergebnis ist falsch.

Wie füge ich Pfad in Kommandozeile?

War es hilfreich?

Lösung

Wenn Sie einige Debug-Informationen, wie zB die Werte von ParamStr (0) und dem Weg gab, ich glaube, Sie Ihre eigene Antwort finden würde. Ich denke, der Fehler ist hier: ParamStr (0) + ExtractFilePath (ParamStr (0))

Also, wenn Ihre App c: \ apps \ foo.exe dann wirst du effektiv zu rufen: ExecProcess ( 'c: \ apps \ foo.exec: \ apps \');

Ich glaube nicht, dass das, was Sie wollten. Aber sagen Sie nicht, was Sie tun, so dass es schwer ist, um sicher zu wissen ....

Andere Tipps

Jedes Mal, wenn ich Probleme mit Pfaden haben, ist es entweder

  1. Der Pfad hat Räume in sie und muss in Anführungszeichen zu verpackenden
  2. Die Schrägstriche im Pfad wie Escape-Zeichen und müssen behandelt werden, zu verdoppeln ‚\‘

Als Chris erwähnt, sind verketten Sie die beiden Werte (ohne Leerzeichen dazwischen) in einer langen Reihe. Da `c: \ apps \ foo.exec: \ apps \‘ ist wahrscheinlich nicht ganz das, was man beabsichtigt, sollten Sie wahrscheinlich nicht so tun.

Darüber hinaus, wenn eine der beiden Pfade Leerzeichen enthalten, müssen Sie doppelte Anführungszeichen hinzuzufügen. Delphi hat eine Funktion in SysUtils nur für diesen Zweck:

var
  AppPath, ExePath: string
begin
  // Setup StartupInfo and ProcInfo as before. Omitted for brevity here.
  ExePath := AnsiQuotedStr(ParamStr(0), '"');
  AppPath := AnsiQuotedStr(ExtractFilePath(ExePath), '"');
  Result:= CreateProcess(nil, ExePath, Nil, Nil, False, 0,
                         Nil, Apppath, StartupInfo, ProcInfo);

end;

Beachten Sie, dass die beiden Werte auf String-Variablen durch die Zuordnung, die PChar Besetzung der Regel nicht notwendig, da der Compiler implizit es für Sie behandelt.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top