Domanda

CreateProcess () restituisce false quando la riga di comando contiene un path.I non capiscono perché.

Qui ho semplificato l'operazione:

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.

Il risultato è falso.

Come faccio percorso di inclusione nella riga di comando?

È stato utile?

Soluzione

Se ti ha dato alcune informazioni di debug come ad esempio i valori di ParamStr (0) e percorso, penso che si può trovare la propria risposta. Credo che l'errore è qui: ParamStr (0) + ExtractFilePath (ParamStr (0))

Quindi, se la vostra applicazione è c: \ apps \ foo.exe allora si sta andando ad essere efficace chiamando: ExecProcess ( 'c: \ apps \ foo.exec: \ apps \');

Non credo che quello che volevi. Tuttavia, non dici quello che stai facendo, quindi è difficile sapere con certezza ....

Altri suggerimenti

Ogni volta che ho problemi con i percorsi, è uno

  1. Il percorso ha spazi in esso e deve essere racchiusa tra virgolette
  2. I backslash nel percorso vengono trattati come caratteri di escape e devono essere raddoppiate '\'

Come Chris accennato, si sta concatenando i due valori (senza spazio tra loro) in una lunga stringa. Dal `c: \ apps \ foo.exec: \ apps \' probabilmente non è proprio quello che è destinato, probabilmente non dovrebbe essere facendo questo.

Inoltre, se uno dei percorsi contengono spazi, potrebbe essere necessario aggiungere virgolette. Delphi ha una funzione in SysUtils proprio a questo scopo:

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;

Si noti che assegnando i due valori di variabili stringa, il cast PChar di solito non è necessario, come il compilatore implicitamente gestire la cosa per voi.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top