Gladir.com - Assembleur et Pascal - Exécution de programmes fils et de sessions


Peu importe le système d'exploitation compatible DOS, il offre tous le service 4Bh de l'interruption 21h. Celle-ci permet d'exécuter un programme fils totalement indépendant de l'application courante. Bien que la technique demeure assez simple, peut existe sur le sujet. Toutefois certains écrivant comme Philippe Mercier en font une brève description. Toutefois, les autres fonctions disponible sur OS/2 par exemple, sont ma fois très peut documenté, en faite, je n'ai jamais trouver de l'information ailleurs sur le sujet que l'incroyable documentation de Ralf Brown.

Tout d'abord l'exemple passe partout, fonctionnant aussi bien sur Windows 9X, DR-DOS ou OS/2. La démonstration suivant permet d'exécuter un programme fils à partir d'un programme parent. Il est a noter qu'il faudra au préalable libérer suffisamment de mémoire pour que le programme fils puisse être exécuté.

Procedure SaveCPURegisters;Assembler;ASM
 DW 0 { SS }
 DW 0 { SP }
 DW 0 { BP }
 DW
0 { DS }
END;

Procedure Exec(Prg,Param:String);
Type
 SaveCPURegistersRec=Record
  SS:Word;
  SP:Word;
  BP:Word;
  DS:Word
;
 End;
Var
 DataParam:Record
  AddrEnv:Word;
  Command:Pointer;
  FCB1:Pointer;
  FCB2:Pointer;
  FCBData1
:Array[0..36]of Byte;
  FCBData2
:Array[0..36]of Byte;
 End;
Begin
 FillChar(DataParam,SizeOf(DataParam),0);
 Param:=Param+^M;
 Prg:=Prg+#0;
 DataParam.Command:=@Param;
 DataParam.FCB1:=@DataParam.FCBData1;
 DataParam.FCB2:=@DataParam.FCBData2
;
 ASM
  MOV Word Ptr SaveCPURegisters.SaveCPURegistersRec.&SS,SS
  MOV Word Ptr SaveCPURegisters.SaveCPURegistersRec.&SP,SP
  MOV Word Ptr SaveCPURegisters.SaveCPURegistersRec.&BP,BP
  MOV Word Ptr SaveCPURegisters.SaveCPURegistersRec.&DS,DS
  PUSH SS
  POP ES
  MOV BX,Offset DataParam
  ADD BX,BP
  PUSH SS
  POP DS
  MOV DX,Offset Prg[1]
  ADD DX,BP
  MOV AX,04B00h
  INT 21h
  MOV SS,Word Ptr SaveCPURegisters.SaveCPURegistersRec.&SS
  MOV SP,Word Ptr SaveCPURegisters.SaveCPURegistersRec.&SP
  LDS BP,DWord Ptr
SaveCPURegisters.SaveCPURegistersRec.&BP
 END;
End;



Sous OS/2, des services supplémentaires très complet permettent de lancer l'exécution dans une session séparé. Quel est l'avantage de leur système? Aucun besoin de libérer de mémoire du programme parent! Se petit bijou de routine est toutefois peut connu, je n'ai jamais vu aucun programme utilisant cette fonction, mais pas dans la distribution d'OS/2 Warp. Cependant, nous l'avons personnellement tester sur le système d'exploitation d'IBM et aucun problème n'a été rencontrer. Dans le pire des cas, lorsque vous envoyez des informations erroné, il ne se lance pas de programme.

Const
 (*******************************)
 (* Système d'exploitation OS/2 *)
 (*******************************)

  { Relation du processus }
 prNew=$0001; { Indépendant }
 prChild=$0002; { Enfant }

   Priorité de la session }
 prForeground=$0000; { Premier plan }
 prBackground=$0001; { Arrière plan }

   Modèle de session }
 stDefault=$0000; { Par défaut }
 stOS2FullScrn=$0001; { OS/2 Plein écran }
 stOS2Window=$0002; { OS/2 en fenêtre }
 stPM=$0003; { Gestionnaire de présentation d'OS/2 }
 stDosFullScrn=$0004; { Dos pleine écran }
 stDosWindow=$0007; { Dos en fenêtre }

Type
 OS2StartData=Record
  LenStruct:Word; { Longueur de la structure (peut être 0018h, 001Eh, 0020h, 0032h, 003Ch) }
  Process:Word; { Relation du nouveau processus (pr??): 0000h = Indépendant, 0001h = Enfant}
  Priority:Word; { Priorité de la session: 0000h = Premier plan 0001h = Arrière plan }
  Trace:Word; { Les options de traces }
  Title:PChar; { Titre du programme }
  Name:PChar; { Nom du programme }
  Args:PChar; { Argument du programme }
  TermQ:PChar; { "TermQ"}
  Environment:PChar; { Variable d'environnement }
  Inherit:WordBool; { Héritier des données }
  SessionType:Word; { Modèle de session (st????) }
  Icon:PChar; { Nom de l'icône }
  PgmHandle:PChar; { Le "PgmHandle" }
  PgmControl:Word; { Le "PgmControl" }
  Column:Word; { Colonne }
  Row:Word; { Ligne }
  Width:Word; { Largeur }
  Height:Word; { Hauteur }
  Reserved:Word; { Réservée }
  ObjectBuffer:LongInt; { Pointeur sur le tampon d'objet }
  ObjectBufferLen:Word; { Longueur du tampon d'objet }
 End;

{ Cette fonction permet d'exécuter une session d'application OS/2.}

Function OS2Exec(Const Data:OS2StartData):Word;Assembler;ASM
  PUSH DS
  LDS SI,Data
  MOV AH,064h
  MOV BX,0025h
  MOV CX,636Ch
  INT 21h
  POP
DS
END;



Il est noter que le source précédent a été éprouvé sous le MonsterBook et qu'il s'est révéler parfaitement fonctionnel sous OS/2 Warp 3et OS/2 Warp 4.


Dernière mise à jour: Vendredi, le 27 janvier 2006