begin process at 2008 05 16 06:59:43
1 173 219 membres
62 nouveaux aujourd'hui
13 970 membres club

Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum.
Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

Sujet : CreateProcess: Pb de lancement d'un processus [ Système / Exécution ] (JeremyLecouvert)

CreateProcess: Pb de lancement d'un processus le 25/04/2008 13:15:04

JeremyLecouvert

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:


Zone de Texte: 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;

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 .


Re : CreateProcess: Pb de lancement d'un processus le 25/04/2008 13:19:08

JeremyLecouvert
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!

Re : CreateProcess: Pb de lancement d'un processus le 25/04/2008 13:32:58

cirec
Membre Club
(Admin CS)
Salut,
et "DisplayProcessError" te dit quoi

 
@+
Cirec


Re : CreateProcess: Pb de lancement d'un processus le 25/04/2008 13:41:33

JeremyLecouvert
C'est une procedure qui remplit un TMemo avec SysErrorMessage(GetLastError); et elle me dit "Opération réussie".

Re : CreateProcess: Pb de lancement d'un processus le 26/04/2008 11:27:13

f0xi
Membre Club
(Admin CS)
Réponse acceptée !


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





Re : CreateProcess: Pb de lancement d'un processus le 28/04/2008 12:35:18

JeremyLecouvert
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 ..
@+


Classé sous : process, pi, nil, createprocess, classpath

Participer à cet échange

Appels d'offres

Pub



CalendriCode

Mai 2008
LMMJVSD
   1234
567891011
12131415161718
19202122232425
262728293031 

VS Express FR Gratuit !

VS Express en français et 100% gratuit !

Téléchargements

Logiciels à télécharger sur le même thème :

Boutique

Boutique de goodies CodeS-SourceS