Comment ouvrir MSDOS sous delphi

Résolu
Utilisateur anonyme - 19 août 2005 à 02:23
cs_grandvizir Messages postés 1106 Date d'inscription samedi 8 novembre 2003 Statut Membre Dernière intervention 3 septembre 2006 - 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

6 réponses

cs_grandvizir Messages postés 1106 Date d'inscription samedi 8 novembre 2003 Statut Membre Dernière intervention 3 septembre 2006 22
21 août 2005 à 10:47
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...

3
cs_grandvizir Messages postés 1106 Date d'inscription samedi 8 novembre 2003 Statut Membre Dernière intervention 3 septembre 2006 22
21 août 2005 à 16:51
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).

===========
3
hurrycane Messages postés 117 Date d'inscription samedi 4 janvier 2003 Statut Membre Dernière intervention 19 juin 2009 1
19 août 2005 à 03:16
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
0
cs_grandvizir Messages postés 1106 Date d'inscription samedi 8 novembre 2003 Statut Membre Dernière intervention 3 septembre 2006 22
19 août 2005 à 10:03
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...

0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Utilisateur anonyme
19 août 2005 à 11:30
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
0
Utilisateur anonyme
19 août 2005 à 15:25
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.
0
Rejoignez-nous