2010-04-05 6 views
1

CreateProcess() renvoie la valeur false lorsque la ligne de commande contient un chemin. Je ne comprends pas pourquoi.Comment inclure un chemin dans la ligne de commande?

Ici, je simplifié l'opération:

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. 

Le résultat est faux.

Comment inclure le chemin dans la ligne de commande?

Répondre

4

Si vous avez donné quelques informations de débogage telles que les valeurs de ParamStr (0) et Path, je pense que vous trouveriez votre propre réponse. Je pense que l'erreur est ici: ParamStr (0) + ExtractFilePath (ParamStr (0))

Donc, si votre application est c: \ apps \ foo.exe alors vous allez être appeler efficacement: ExecProcess ('c: \ apps \ foo.exec: \ apps \');

Je ne pense pas que ce soit ce que vous vouliez. Cependant, vous ne dites pas ce que vous faites, donc c'est difficile à savoir avec certitude ...

4

Chaque fois que je rencontre des problèmes avec des chemins, il est soit

  1. Le chemin comporte des espaces et doit être enveloppé dans des citations
  2. Les barres obliques inversées du chemin sont traités comme des caractères d'échappement et doivent être doublé '\'
2

Comme Chris l'a mentionné, vous concaténez les deux valeurs (sans espace entre elles) dans une longue chaîne . Puisque `c: \ apps \ foo.exec: \ apps \ 'n'est probablement pas ce que vous vouliez, vous ne devriez probablement pas le faire.

En outre, si l'un des chemins contient des espaces, vous devrez peut-être ajouter des guillemets. Delphi a une fonction dans SysUtils juste à cette fin:

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; 

Notez que les deux en attribuant des valeurs aux variables de chaîne, la distribution PChar est généralement pas nécessaire, car le compilateur traitera implicitement pour vous.

Questions connexes