[Delphi] lancer un programme DOS ? [résolu]

lancer un programme DOS ? [résolu] [Delphi] - Delphi/Pascal - Programmation

Marsh Posté le 18-04-2002 à 15:45:54    

Je veux juste lancer automatiquement :  
232_read import.txt,1,1,1,1,1,1,0 (232_read.exe étant le programme dos)
ce programme crée un fichier texte et ce ferme, donc je voudrai récuperer la main que qd il a fini de créer son fichier si possible, mais bon déjà le lancer serait pas mal :D
 
merci de votre aide :jap:

 

[jfdsdjhfuetppo]--Message édité par Aiua--[/jfdsdjhfuetppo]


---------------
"The pen is mightier than the sword if the sword is very short, and the pen is very sharp." TP. Mes Jeux. Mes Ventes. Groupe HFR sur PlayFire.
Reply

Marsh Posté le 18-04-2002 à 15:45:54   

Reply

Marsh Posté le 18-04-2002 à 15:57:49    

ShellExecute(0, nil, '232_read.exe', 'import.txt,1,1,1,1,1,1,0', Folder, SW_SHOWNORMAL);
 
Où Folder contient le dossier par défaut.
Il vaut mieux spéficier le dossier du programme :
À la place de '232_read.exe' mettre PChar(ExtractFilePath(Application.ExeName) + '232_read.exe';)) si jamais le propramme 232_read est dans le même dossier, par exemple.
 
Pour voir quand le programme se ferme, je crois qu'il faut faire ça avec CreateProcess. Peut-être qu'il y a moyen avec ShellExecuteEx.
 
PS: il faudra sans doute ajouter ShellAPI dans les "uses" de la unit.

 

[jfdsdjhfuetppo]--Message édité par antp--[/jfdsdjhfuetppo]


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 18-04-2002 à 16:12:03    

merci, au moins là j'arrive à lire le fichier, le pb c'est qu'il n'attend pas pour continuer mon prog
 
sur CreateProcess j'ai essayé :

Code :
  1. var
  2.   L_StartupInfo: TStartupInfo;
  3.   L_ProcessInfo: TProcessInformation;
  4. begin
  5. FillChar(L_StartupInfo, SizeOf(L_StartupInfo), #0);
  6. L_StartupInfo.cb := SizeOf(L_StartupInfo);
  7. L_StartupInfo.dwFlags := STARTF_USESHOWWINDOW;
  8. L_StartupInfo.wShowWindow := SW_SHOWNORMAL;
  9. if CreateProcess(nil, '232_read import.txt,1,1,1,1,1,1,0', nil, nil, False, CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS, nil, nil, L_StartupInfo,L_ProcessInfo)
  10. then
  11.   begin
  12.   WaitforSingleObject(L_ProcessInfo.hProcess, INFINITE);
  13.   CloseHandle(L_ProcessInfo.hProcess);
  14.   CloseHandle(L_ProcessInfo.hThread);
  15.   end;
  16. end;


 
 
mais ça ne marche pas :(
mon programme a pas l'air d'être lancé et ça ne me rend jamais la main

 

[jfdsdjhfuetppo]--Message édité par Aiua--[/jfdsdjhfuetppo]


---------------
"The pen is mightier than the sword if the sword is very short, and the pen is very sharp." TP. Mes Jeux. Mes Ventes. Groupe HFR sur PlayFire.
Reply

Marsh Posté le 18-04-2002 à 16:27:54    

c'est bon, j'ai trouvé :)
j'utilise :
 

Code :
  1. function TDLG_inventaire.WinExecAndWait32(FileName:String):integer;
  2.    var
  3.     zAppName:array[0..512] of char;
  4.     zCurDir:array[0..255] of char;
  5.     WorkDir:String;
  6.     StartupInfo:TStartupInfo;
  7.     ProcessInfo:TProcessInformation;
  8.     code : cardinal;
  9. begin
  10.   StrPCopy(zAppName,FileName);
  11.   GetDir(0,WorkDir);
  12.   StrPCopy(zCurDir,WorkDir);
  13.   FillChar(StartupInfo,Sizeof(StartupInfo),#0);
  14.   StartupInfo.cb := Sizeof(StartupInfo);
  15.   StartupInfo.dwFlags := STARTF_USESHOWWINdow;
  16.   StartupInfo.wShowWindow := 0 ;
  17.    if not CreateProcess( nil , zAppName, nil , nil , false,
  18. CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS, nil , nil ,StartupInfo,ProcessInfo) then Result := -1
  19.   else begin
  20.     WaitforSingleObject(ProcessInfo.hProcess,INFINITE);
  21.     GetExitCodeProcess(ProcessInfo.hProcess,code);
  22.     Result := Integer(code);
  23.    end ;
  24. end ;


 
 
et je lui passe en parametre '232_read import.txt,1,1,1,1,1,1,0'
 
et ça marche :hot:


---------------
"The pen is mightier than the sword if the sword is very short, and the pen is very sharp." TP. Mes Jeux. Mes Ventes. Groupe HFR sur PlayFire.
Reply

Marsh Posté le 18-04-2002 à 16:34:59    

plutôt que d'utiliser les array of char, tu peux faire simplement un PChar(FileName) dans les paramètres, c'est plus pratique (pas besoin de StrPCopy etc...)
 
Je vais garder ta fonction sous la main, c'est bon à savoir pour si jamais j'en ai besoin ;)


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 18-04-2002 à 16:37:02    

ah ! si tu le dis, j'sais pas moi j'ai repompé la fonction :D
disons que ça marche comme ça meme si je comprends pas tout :D


---------------
"The pen is mightier than the sword if the sword is very short, and the pen is very sharp." TP. Mes Jeux. Mes Ventes. Groupe HFR sur PlayFire.
Reply

Marsh Posté le 18-04-2002 à 16:42:49    

Version allégée:
 

Code :
  1. function WinExecAndWait32(const FileName: string): Integer;
  2. var
  3.   StartupInfo: TStartupInfo;
  4.   ProcessInfo: TProcessInformation;
  5.   code: Cardinal;
  6. begin
  7.   FillChar(StartupInfo,Sizeof(StartupInfo),#0);
  8.   with StartupInfo do
  9.   begin
  10.     cb := Sizeof(StartupInfo);
  11.     dwFlags := STARTF_USESHOWWINDOW;
  12.     wShowWindow := 0;
  13.   end;
  14.   if not CreateProcess(nil , PChar(FileName), nil, nil, False,
  15. CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS, nil, nil, StartupInfo, ProcessInfo) then
  16.     Result := -1
  17.   else
  18.   begin
  19.     WaitforSingleObject(ProcessInfo.hProcess, INFINITE);
  20.     GetExitCodeProcess(ProcessInfo.hProcess, code);
  21.     Result := Integer(code);
  22.   end;
  23. end;


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 18-04-2002 à 16:48:09    

testé et approuvé :)
merci :jap:


---------------
"The pen is mightier than the sword if the sword is very short, and the pen is very sharp." TP. Mes Jeux. Mes Ventes. Groupe HFR sur PlayFire.
Reply

Marsh Posté le 18-04-2002 à 17:06:42    

en fait il faut rajouter les CloseHandle à la fin par ce que sinon le prog il continue à tourner en fond, et à 20% du proc en plus le salop :D
bizarrement à trois en meme temps je m'en suis vite rendu compte que ça ramais :D
donc la fin c'est en fait :
 
[code]
 begin  
   WaitforSingleObject(ProcessInfo.hProcess, INFINITE);  
   GetExitCodeProcess(ProcessInfo.hProcess, code);  
   Result := Integer(code);  
 end;  
 CloseHandle(L_ProcessInfo.hProcess);
 CloseHandle(L_ProcessInfo.hThread);
end;

 

[jfdsdjhfuetppo]--Message édité par Aiua--[/jfdsdjhfuetppo]


---------------
"The pen is mightier than the sword if the sword is very short, and the pen is very sharp." TP. Mes Jeux. Mes Ventes. Groupe HFR sur PlayFire.
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed