Come includere percorso nella riga di comando?
-
24-09-2019 - |
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?
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
- Il percorso ha spazi in esso e deve essere racchiusa tra virgolette
- 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.