Bonjour à tous,

Je cherche actuellement à faire une fonction me permettant de lancer un programme externe à partir de mon code C++ (je travaille sous C++ Builder 5).
Cependant, il ne suffit pas de lancer simplement le programme, il faut attendre qu'il se termine avant de continuer les traitements.
J'ai essayé plusieurs choses, je vous mets mon code avec quelques explications et les problèmes que je rencontre :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
bool __fastcall test::runExternalExecutable(String sDSN, String sUsername, String sPassword, String sSetOrGroup, String sSelData, long worldId, String sResFilePrefix)
{   
   sExtPath = "C:\\Program Files\\test\\testexe";
 
   String app = "test.exe";
   String param = sDSN + " " + sUsername + " " + sPassword + " " + sSetOrGroup + " " + sSelData + " " + IntToStr(worldId) + " " + sResFilePrefix;
 
   if(!(ShellExecute(NULL, "open", app.c_str(), param.c_str(), sExtPath.c_str(), SW_SHOW) > (HINSTANCE)32))
   {
        String info = "Cannot start '" + app + " " + param + "'";
        Application->MessageBox(info.c_str(), "erreur", MB_OK);
   }
   return FileExists(sResFilePrefix + "_F"); 
 
   //*** problème de l'approche ci-dessus : n'attend pas que que le programme soit terminé avant de continuer
 
  /*HANDLE hProcess;
  DWORD ProcessId;
  DWORD exitCode;
  sExtPath = "C:\\Program Files\\test\\testexe\\";
  String app = "test.exe";
  String param = sDSN + " " + sUsername + " " + sPassword + " " + sSetOrGroup + " " + sSelData + " " + IntToStr(worldId) + " " + sResFilePrefix;
 
  String sCmd = sExtPath + app + " " + param;
  ProcessId = system(sCmd.c_str());
  if(ProcessId == 0)
        Application->MessageBox("erreur", "logSQL", MB_OK);
  else
  {
        hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, false, ProcessId);
        do
        {
                GetExitCodeProcess(hProcess, &exitCode);
                Application->ProcessMessages();
        }while(exitCode == STATUS_PENDING);
        CloseHandle(hProcess);
  }*/
  return true;
}
Pour les constantes utilisées, les voici :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
const short test::PROCESSQUERYINFORMATION = 0x400;
const long test::STATUSPENDING = 0x103;
Donc, comme vous pouvez le voir dans le code, le problème de la première approche (qui fonctionne pourtant magnifiquement bien) est que le programme n'attend pas que l'.exe soit terminé avant de continuer ses traitements.
En ce qui concerne la deuxième approche, elle est censée résoudre le défaut de la première mais ne fonctionne malheureusement pas. Je vois juste la fenêtre de commande de Windows (cmd) se lancer et disparaître en un éclair.

Voilà, si quelqu'un peut y jeter un coup d'oeil et me donner un p'tit coup d'pouce par la même occasion, je lui en serais fort reconnaissant.
Merci d'avance.