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.
|