CreateProcess: Pb de lancement d'un processus

Résolu
JeremyLecouvert Messages postés 139 Date d'inscription mardi 27 novembre 2007 Statut Membre Dernière intervention 10 mai 2010 - 25 avril 2008 à 13:15
JeremyLecouvert Messages postés 139 Date d'inscription mardi 27 novembre 2007 Statut Membre Dernière intervention 10 mai 2010 - 28 avril 2008 à 12:35
Bonjour tout le monde,


J'ai un pti souci avec la fonction CreateProcess, et je comprends pas où ça
coince!

Voilà le topo: mon appli est composée de  3 classes java et d'un
"lanceur" développé en Delphi (BDS 2006). Chacun des 3 
traitements est lancé par un appel à CreateProcess, mais l'un des 3 ne marche
pas comme je veux, alors qu'il est construit de la même manière que les 2
autres. Voici mon code:







<!--[if mso & !supportInlineShapes & supportFields]> SHAPE  \* MERGEFORMAT <![endif]-->
<!--[if gte vml 1]><v:shapetype
id="_x0000_t202" coordsize="21600,21600" o:spt="202" path="m,l,21600r21600,l21600,xe">
<v:stroke joinstyle="miter"/>
<v:path gradientshapeok="t" o:connecttype="rect"/>
</v:shapetype><v:shape id="_x0000_s1026" type="#_x0000_t202" style='width:414pt;
height:7in;mso-position-horizontal:absolute;
mso-position-horizontal-relative:char;mso-position-vertical:absolute;
mso-position-vertical-relative:line'>
<v:textbox>
<![if !mso]>
<![endif]>

procedure
TBusinessTreatment.InsertBookmarks(pdf, csv: String);

var

cmd, classpath: String;

si: STARTUPINFO;

pi: PROCESS_INFORMATION;

ret: Cardinal;

pCmd: PAnsiChar;

i: integer;

begin

//création du classpath java

classpath:= '';

for i:=0 to Length(LIBS)-1 do

classpath:= classpath + AppPath + LIBS[i];

cmd:= 'java -Xms16m -Xmx512m -cp "'+ classpath + '"
"InsertBookmarks" "';

pCmd:= PAnsiChar(cmd + StringReplace(pdf, '\', '/',[rfReplaceAll]) +
'" "' + StringReplace(csv, '\', '/',[rfReplaceAll]) + '"');

CreateProcess(nil,

pCmd,

nil, nil, False, 0, nil, nil, si, pi);

ret:= WaitForSingleObject(pi.hProcess, INFINITE);

if ret=WAIT_FAILED then //échec de la fonction

begin

DisplayProcessError; //Fct d'affichage de
l'erreur

CloseProcess(pi); //Fermeture du process

end

else

begin //process terminé (valeur de retour=
WAIT_OBJECT_0)           CloseInsertOperation(pdf, csv);

CloseProcess(pi);

end; //end if

end;

<![if !mso]>

<![endif]></v:textbox>
<w:wrap type="none"/>
<w:anchorlock/>
</v:shape><![endif]-->
<!--[if !vml]-->

<!--[endif]-->
<!--[if gte vml 1]><v:shapetype id="_x0000_t75"
coordsize="21600,21600" o:spt="75" o:preferrelative="t" path="m@4@5l@4@11@9@11@9@5xe"
filled="f" stroked="f">
<v:stroke joinstyle="miter"/>
<v:formulas>
<v:f eqn="if lineDrawn pixelLineWidth 0"/>
<v:f eqn="sum @0 1 0"/>
<v:f eqn="sum 0 0 @1"/>
<v:f eqn="prod @2 1 2"/>
<v:f eqn="prod @3 21600 pixelWidth"/>
<v:f eqn="prod @3 21600 pixelHeight"/>
<v:f eqn="sum @0 0 1"/>
<v:f eqn="prod @6 1 2"/>
<v:f eqn="prod @7 21600 pixelWidth"/>
<v:f eqn="sum @8 21600 0"/>
<v:f eqn="prod @7 21600 pixelHeight"/>
<v:f eqn="sum @10 21600 0"/>
</v:formulas>
<v:path o:extrusionok="f" gradientshapeok="t" o:connecttype="rect"/>
<o:lock v:ext="edit" aspectratio="t"/>
</v:shapetype><![endif]-->
<!--[if mso & !supportInlineShapes & supportFields]><v:shape
id="_x0000_i1025" type="#_x0000_t75" style='width:414pt;height:7in'>
<v:imagedata croptop="-65520f" cropbottom="65520f"/>
</v:shape><![endif]-->



<!--[if !supportLineBreakNewLine]-->


<!--[endif]-->



Le problème, c’est qu’il génère à chaque fois une erreur, et
le GetLastError me renvoie l’optimiste message « Opération réussie » ???    -> Je suppose que l’opération en
question, c’est le plantage de la fonction .. sinon, j’vois pas ce qui a
réussi !!



 




En tout cas, le problème ne vient pas de la ligne de
commande, parce qu’elle s’exécute bien quand je la lance directement dans le
DOS. Du coup, je sais vraiment plus ce que je peux faire pour que ça marche, surtout
que pour les 2 autres process ça marche nickel…



 





            Please, I
need help !



 




En vous remerkiant …

5 réponses

f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 35
26 avril 2008 à 11:27
pi: PROCESS_INFORMATION;




evite cela deja ... PI existe en delphi (renvois le nombre pi)
mets plutot ProcInfo ou ProcNfo

pour la commande il vaut mieux faire :

Cmd : string;
...
CreateProcess( nil, PChar(cmd), ...);

et tu peu aussi faire :

StringReplace(pdf+'"  "'+csv, '\', '/',[rfReplaceAll])

pour eviter 2 appels a StringReplace

<hr size="2" width="100%" />
3
JeremyLecouvert Messages postés 139 Date d'inscription mardi 27 novembre 2007 Statut Membre Dernière intervention 10 mai 2010 2
25 avril 2008 à 13:19
Oups, désolé, pti pb de mise en forme sur le bout de code...

procedure
TBusinessTreatment.InsertBookmarks(pdf, csv: String);

var

  cmd, classpath: String;

  si: STARTUPINFO;

  pi: PROCESS_INFORMATION;

  ret: Cardinal;

  pCmd: PAnsiChar;

  i: integer;

begin

    //création du classpath java

  classpath:= '';

  for i:=0 to Length(LIBS)-1 do

    classpath:= classpath + AppPath + LIBS[i];

  cmd:= 'java -Xms16m -Xmx512m -cp "'+ classpath + '"
"InsertBookmarks" "';


  pCmd:= PAnsiChar(cmd + StringReplace(pdf, '\', '/',[rfReplaceAll]) +
'" "' + StringReplace(csv, '\', '/',[rfReplaceAll]) + '"');

  CreateProcess(nil, 

               
pCmd,

               
nil, nil, False, 0, nil, nil, si, pi);


  ret:= WaitForSingleObject(pi.hProcess, INFINITE);

  if ret=WAIT_FAILED then   //échec de la fonction

  begin

    DisplayProcessError;   //Fct d'affichage de
l'erreur

    CloseProcess(pi);   //Fermeture du process

  end

  else

  begin   //process terminé (valeur de retour= WAIT_OBJECT_0)
    CloseInsertOperation(pdf, csv);

    CloseProcess(pi);

  end;  //end if

end;

    ... Voilà, c'est un peu mieux!
0
Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 50
25 avril 2008 à 13:32
Salut,
et "DisplayProcessError" te dit quoi

 
@+
Cirec

<hr siz="" />
0
JeremyLecouvert Messages postés 139 Date d'inscription mardi 27 novembre 2007 Statut Membre Dernière intervention 10 mai 2010 2
25 avril 2008 à 13:41
C'est une procedure qui remplit un TMemo avec SysErrorMessage(GetLastError); et elle me dit "Opération réussie".
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
JeremyLecouvert Messages postés 139 Date d'inscription mardi 27 novembre 2007 Statut Membre Dernière intervention 10 mai 2010 2
28 avril 2008 à 12:35
Salut tout le monde,

    ça y est, ça marche... merci fOxi! Ceci dit, je suis pas sûr de savoir pourquoi !!

Pour le 'pi', je l'ai changé en 'pInfo'; ça ne créait pas de conflit, mais tu as raison, il vaut être rigoureux ça évite les soucis..
Pour les types PChar et PAnsiChar, je n'ai pas l'habitude de les utiliser; je ne sais pas si il y des différences selon si on utilise l'un ou l'autre. D'après l'aide Delphi, C'est équivalent sous Win32...

Bizarrement, si j'exécute le code:
      CreateProcess(nil, PChar(cmd), nil, nil, False, 0, nil, nil, si, pInfo);
 Ca marche nickel. Par contre, si je déclare un PChar et que je fais:
       pCmd:= PChar(cmd);
      CreateProcess(nil, PChar(cmd), nil, nil, False, 0, nil, nil, si, pInfo);
Cette fois, j'ai la même erreur que la dernière fois, ou l'erreur "accès refusé". Pourtant, je ne me sers même pas de 'pCmd'... on dirait que le simple fait de faire l'affectation modifie 'cmd'... Chais pas keskispass !!

Si quelqu'un peut apporter ses lumières à mon petit cerveau embrumé, je suis preneur !!

En tout cas, je valide ta réponse puisque mon pb est résolu ..
@+
0
Rejoignez-nous