🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Thread View: comp.os.os2.programmer
1 messages
1 total messages Started by Mikael Wahlgren Wed, 08 Apr 1992 21:13
Executing DOS commands in OS/2 1.3
#644
Author: Mikael Wahlgren
Date: Wed, 08 Apr 1992 21:13
103 lines
3617 bytes
On request, I will post a Modula-2 example on how to start a DOS command
in the OS/2 1.3 DOS-box.  This example uses the DOS.SYS driver to start
a DOS-command, switches to the DOS-session, and when the command is finished
switches back to the original session.

Mikael Wahlgren


MODULE DosCmd2;

IMPORT FIO, Dos, Str, Win;

FROM OS2DEF   IMPORT HWND, HAB;

PROCEDURE SwitchToDos;
  VAR
    ReturnCode      : CARDINAL;
    GlobalInfoSel   : CARDINAL;
    LocalInfoSel    : CARDINAL;
    GlobalInfoSeg   : POINTER TO Dos.GINFOSEG;
    LocalInfoSeg    : POINTER TO Dos.LINFOSEG;
    FgHandle        : Win.HSWITCH;
    DosHandle       : CARDINAL;
    SwitchBuffer    : RECORD
                        SwitchCount     : CARDINAL;
                        SwitchEntry     : ARRAY [1..100] OF RECORD
                                            SwitchHandle    : Win.HSWITCH;
                                            SwitchControl   : Win.SWCNTRL;
                                          END;
                      END;
    Count           : CARDINAL;
  BEGIN

    (* First we get the foreground process ID from the local info seg *)

    Dos.GetInfoSeg(GlobalInfoSel,LocalInfoSel);
    GlobalInfoSeg := [GlobalInfoSel:0];
    LocalInfoSeg  := [LocalInfoSel:0];
    FgHandle      := Win.QuerySwitchHandle(HWND(0),LocalInfoSeg^.pidCurrent);

    (* Get the switch list *)

    Count := Win.QuerySwitchList(HAB(0),ADR(SwitchBuffer),SIZE(SwitchBuffer));

    (* Find the switch entry containing the string 'DOS' *)

    WHILE ((Count <> 0) AND (Str.Compare(SwitchBuffer.SwitchEntry[Count].SwitchControl.Swtitle,'DOS') <> 0)) DO
      DEC(Count);
    END;

    IF Count <> 0 THEN

      (* We found a switch entry with the string 'DOS'.  Switch to it *)

      DosHandle := GlobalInfoSeg^.pidForeground;
      Win.SwitchToProgram(SwitchBuffer.SwitchEntry[Count].SwitchHandle);

      (* Loop slowly until we have detected another foreground PID, this
         means that OS/2 has switched to the DOS-session *)

      REPEAT
        Dos.Sleep(100);
      UNTIL DosHandle <> GlobalInfoSeg^.pidForeground;
      DosHandle := GlobalInfoSeg^.pidForeground;

      (* Loop slowly once again until we have detected yet another
         foreground PID, this means that OS/2 has switched to the desktop
         after finishing the DOS command *)

      REPEAT
        Dos.Sleep(100);
      UNTIL DosHandle <> GlobalInfoSeg^.pidForeground;

      (* Switch back to our original session *)

      Win.SwitchToProgram(FgHandle);
    END;
  END SwitchToDos;


PROCEDURE DosCmd(Txt : ARRAY OF CHAR);
  VAR
    DosDrv          : FIO.File;
    CmdBuffer       : ARRAY [1..128] OF CHAR;
  BEGIN

    (* Open DOS.SYS driver and write command information *)

    Str.Concat(CmdBuffer, CHR(128) + CHR(32), Txt);
    Str.Append(CmdBuffer, CHR(13));
    DosDrv := FIO.Create('DOS$');
    FIO.WrStr(DosDrv, CmdBuffer);
    FIO.WrChar(DosDrv, CHR(0));
    FIO.Close(DosDrv);
    SwitchToDos;
  END DosCmd;

BEGIN
  DosCmd('DIR');
END DosCmd2.


Mikael Wahlgren      d9mikael@dtek.chalmers.se
Thread Navigation

This is a paginated view of messages in the thread with full content displayed inline.

Messages are displayed in chronological order, with the original post highlighted in green.

Use pagination controls to navigate through all messages in large threads.

Back to All Threads