Comment ouvrir MSDOS sous delphi [Résolu]

Utilisateur anonyme - 19 août 2005 à 02:23 - Dernière réponse : cs_grandvizir 1237 Messages postés samedi 8 novembre 2003Date d'inscription 3 septembre 2006 Dernière intervention
- 21 août 2005 à 16:51
Bonjour,

J'ai déjà posé une question similaire mais il n'y a pas eu de succès. J'ai du mal m'exprimer. Je voudrais pouvoir utiliser le programme MSDOS sous delphi. Je m'explique :

On a une Form contenant 2 boutons OK et STOP ainsi qu'un panel. Je voudrais que quand on clique sur le bouton OK le programme MSDOS s'ouvre. Cependant on doit pouvoir utiliser MSDOS comme si on avait ouvert une invite MSDOS sous windows. On doit pouvoir taper ce que l'on veut sous Windows.

Les choses ne sont pas si simple : je voudrais que le programme MSDOS apparaisse dans le PANEL (et pas dans une fenêtre MSDOS).

Evidemment le bouton STOP arrette toute la procédure : arret de MSDOS et retour au panel d'origine
Afficher la suite 

Votre réponse

7 réponses

Meilleure réponse
cs_grandvizir 1237 Messages postés samedi 8 novembre 2003Date d'inscription 3 septembre 2006 Dernière intervention - 21 août 2005 à 10:47
3
Merci
600ème message CS

De l'aide presque aussi rapide que la lumière
<HR>

C'est le premier code qui est correct : y'a du PIPE, des trucs super méga compliqués... C'était bien çà.

Pour le deuxième code, Windows doit restreindre l'accès à la classe ConsoleWindowClass, conformément à l'attitude de Spy++ envers cette classe :
Bloquer Spy++

RunDosBidule est le code qui récupèrera le flux de la console. Doit être appelé dans un évènement OnClick par exemple.

===========
Validez les réponses si ok...

Merci cs_grandvizir 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 98 internautes ce mois-ci

Commenter la réponse de cs_grandvizir
Meilleure réponse
cs_grandvizir 1237 Messages postés samedi 8 novembre 2003Date d'inscription 3 septembre 2006 Dernière intervention - 21 août 2005 à 16:51
3
Merci
Je voulais juste rajouter une chose : remplace ConsoleWindowClass par ttyGrab si possible. Il y a des chances meilleures pour que ça marche dans le second code (qui m'a l'air périlleux quand même).

===========

Merci cs_grandvizir 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 98 internautes ce mois-ci

Commenter la réponse de cs_grandvizir
hurrycane 123 Messages postés samedi 4 janvier 2003Date d'inscription 19 juin 2009 Dernière intervention - 19 août 2005 à 03:16
0
Merci
c'est comme si tu disais , comment faire pour boire de l'eau avec un cahier ....
hahahahahaha lol je rigole , peut etre que c'est possible
je te propose d'essayer de faire un memo a la maniere de la fenetre dos : et de mettre un gestionnaire d'evennement ONENTER et que a chaque commande il transmet la commande equivalente a DOS. je ne sasis pas exactement je vais essayer ca et je te dirais.... ca doit etre possible


meme si on simule les commandes DOS avec lkes equivalentes sous windows comme pour la console du jeu halflife tu vois .... a plus
Commenter la réponse de hurrycane
cs_grandvizir 1237 Messages postés samedi 8 novembre 2003Date d'inscription 3 septembre 2006 Dernière intervention - 19 août 2005 à 10:03
0
Merci
La console est une dûre à cuir. Pour la faire apparaître à un endroit :
begin
{$APPTYPE Console}
end;

Pour la cacher :
begin
{$APPTYPE Gui}
end;

La console n'est pas une fenêtre comme les autres, donc elle n'apparaîtra pas dans le panel. Tu peux juste absorber la console pour faire afficher son texte dans un mémo. Tapes "ping" dans le moteur de recherche en mode "Codes", ou tapes "WaitForSingleObject".

Pour écrire dans la console, il faut être en mode $APPTYPE=Console, et alors :
WriteLn('Salut');
Write('Salut, sans retour à la ligne');

===========
Validez les réponses si ok...

Commenter la réponse de cs_grandvizir
Utilisateur anonyme - 19 août 2005 à 11:30
0
Merci
J'ai peux être pas été clair. En fait il faudrait ouvrir une fenêtre MSDOS dans un panel ou autre chose et que l'on puisse rentrer des informations dedans.

Voila j'ai deux idées il reste plus qu'à la mettre en CODE et la j'ai besoin de toi

Premier solution :
Tu crées un Edit et non un panel
Quand tu cliques sur OK tu ouvres une fenêtre MSDOS invisible sur l'écran. Tu bloques toutes les autres actions possibles dans la FORM sauf FERMER et tout ce que tu écrit va directement dans le programme MSDOS.
TU fais apparaitres ce que tu écris et ce que tu recois dans la fenêtres MSDOS dans l'EDIT. Quand tu FERMES la fenêtres MSDOS disparait liberation des fonctions de la FORM et réinitialisation de l'EDIT

Deuxième solution :
Tu ouvres une fenêtre MSDOS que tu incruste et "lie" (lier) dans le PANEL ou autre objet. Comme ca si tu déplaces ta FORM la fenêtres MSDOS se déplace comme le PANEL : ni vu ni connu. C'est comme si tu découpais ta fenêtre MSDOS et tu la colles dans le PANEL.

Merci
Commenter la réponse de Utilisateur anonyme
cs_grandvizir 1237 Messages postés samedi 8 novembre 2003Date d'inscription 3 septembre 2006 Dernière intervention - 19 août 2005 à 12:04
0
Merci
Le problème (et il est bien là), c'est que la fenêtre DOS n'est pas une fenêtre comme les autres. Voici deux liens relatifs à la console :
http://www.cppfrance.com/forum.v2.aspx?ID=496143
http://www.delphifr.com/code.aspx?ID=32233

Regarde :
http://www.delphifr.com/recherche.aspx?r=waitforsingleobject&tr=tout

Quoi qu'en C++, il devrait y avoir plus de choses :
http://www.cppfrance.com/recherche.aspx?r=waitforsingleobject&tr=tout

Il faut attacher l'application à la console DOS. Tu récupères les infos dans un TMemo et tu commandes avec des requètes. Il y a un exemple de code dans le bouquin Delphi 7 Studio.
http://www.delphifr.com/livres.aspx?id=46

En tout cas, tu ne pourras pas avoir un cadre noir tout seul incurstable en tant que composant TMsDos (j'imagine).

===========
Commenter la réponse de cs_grandvizir
Utilisateur anonyme - 19 août 2005 à 15:25
0
Merci
Dans un topic précédent on m'a proposé ca

.........
procedure RunDosInMemo(DosApp:String;AMemo:TMemo);
const
ReadBuffer = 2400;
var
Security : TSecurityAttributes;
ReadPipe,WritePipe : THandle;
start : TStartUpInfo;
ProcessInfo : TProcessInformation;
Buffer : Pchar;
BytesRead : DWord;
Apprunning : DWord;
begin
With Security do begin
nlength := SizeOf(TSecurityAttributes);
binherithandle := true;
lpsecuritydescriptor := nil;
end;
if Createpipe (ReadPipe, WritePipe,
@Security, 0) then begin
Buffer := AllocMem(ReadBuffer + 1);
FillChar(Start,Sizeof(Start),#0);
start.cb := SizeOf(start);
start.hStdOutput := WritePipe;
start.hStdInput := ReadPipe;
start.dwFlags := STARTF_USESTDHANDLES +
STARTF_USESHOWWINDOW;
start.wShowWindow := SW_HIDE;

if CreateProcess(nil,
PChar(DosApp),
@Security,
@Security,
true,
NORMAL_PRIORITY_CLASS,
nil,
nil,
start,
ProcessInfo)
then
begin
repeat
Apprunning := WaitForSingleObject
(ProcessInfo.hProcess,100);
Application.ProcessMessages;
until (Apprunning <> WAIT_TIMEOUT);
Repeat
BytesRead := 0;
ReadFile(ReadPipe,Buffer[0],
ReadBuffer,BytesRead,nil);
Buffer[BytesRead]:= #0;
OemToAnsi(Buffer,Buffer);
AMemo.Text := AMemo.text + String(Buffer);
until (BytesRead < ReadBuffer);
end;
FreeMem(Buffer);
CloseHandle(ProcessInfo.hProcess);
CloseHandle(ProcessInfo.hThread);
CloseHandle(ReadPipe);
CloseHandle(WritePipe);
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
Memo1.Clear;
Memo1.Color:=clblack;
Memo1.Font.Color:=clwhite;
RunDosInMemo('cmd /C DIR *.*',Memo1);
end;


et cela :

procedure TForm1.Button1Click(Sender: TObject);
var
pc:array [0..max_path-1] of char;
h:HWND;
FileMSDos:PChar;
unite:string;
begin
h:=0;
GetWindowsDirectory(pc,max_path-1);
unite:=copy(StrPas(pc),1,3);//ça donne "C:" par exemple
FileMSDos:=PChar(StrPas(pc)+'\System32\cmd.exe');
Shellexecute(handle,'open',FileMSDos,'',PChar(unite),SW_HIDE);
while h=0 do h:=findwindow('ConsoleWindowClass',FileMSDos);
Windows.SetParent(h,form1.handle);//tu peux mettre sur un panel càd panel1.handle par exemple
SetWindowPos(h,HWND_TOP,0,0,0,0,SWP_NOSIZE or SWP_SHOWWINDOW);
end;


Je n'ai rien compris à la première proposition (je ne sais meme pas ou il faut mettre la source ptdrrrrrrr) et la deuxième bloque mon pc (pas de réponse de l'executable en faisant cont alt supp).

Tu penses quoi de ces 2 sources et peut tu sois m'aider pour la première soit me dire pourquoi la seconde beug.
Commenter la réponse de Utilisateur anonyme

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.