CreateProcess: Pb de lancement d'un processus [Résolu]

Signaler
Messages postés
139
Date d'inscription
mardi 27 novembre 2007
Statut
Membre
Dernière intervention
10 mai 2010
-
Messages postés
139
Date d'inscription
mardi 27 novembre 2007
Statut
Membre
Dernière intervention
10 mai 2010
-
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

Messages postés
4202
Date d'inscription
samedi 16 octobre 2004
Statut
Modérateur
Dernière intervention
13 juin 2020
37
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%" />
Messages postés
139
Date d'inscription
mardi 27 novembre 2007
Statut
Membre
Dernière intervention
10 mai 2010
2
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!
Messages postés
3826
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
10 mai 2021
44
Salut,
et "DisplayProcessError" te dit quoi

 
@+
Cirec

<hr siz="" />
Messages postés
139
Date d'inscription
mardi 27 novembre 2007
Statut
Membre
Dernière intervention
10 mai 2010
2
C'est une procedure qui remplit un TMemo avec SysErrorMessage(GetLastError); et elle me dit "Opération réussie".
Messages postés
139
Date d'inscription
mardi 27 novembre 2007
Statut
Membre
Dernière intervention
10 mai 2010
2
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 ..
@+