home *** CD-ROM | disk | FTP | other *** search
/ Stars of Shareware: Programmierung / SOURCE.mdf / programm / windows / pascal / mystub / mystub.pas < prev   
Encoding:
Pascal/Delphi Source File  |  1994-09-18  |  5.1 KB  |  180 lines

  1. (********************************************************************
  2.  PROGRAMNAME=MyStub
  3.  FILETYPE=Program
  4.  LANGUAGE=Turbo Pascal/Borland Pascal
  5.  VERSION=1.00
  6.  DATE=17-Sep-1994
  7.  AUTHOR=Stefan Sperling (s.sperling@ame.nbg.sub.org)
  8.  PURPOSE=Neuer erweiterter Stub für Windows-Programme
  9.  COMPILER=Borland Pascal 7.0
  10.  ********************************************************************
  11.  MyStub dient als neuer erweiterter Stub für Windows-Programme.
  12.  Funktionen:
  13.     1. unter DOS: Hinweistext mit optionalem Aufstart von Windows
  14.        plus der Windows-Anwendung
  15.     2. unter Windows: ist MyStub nicht sichtbar (wird nicht aus-
  16.        geführt)
  17.     3. in einer Windows-DOS-Box: Hinweistext, daß die Anwendung
  18.        in dieser Umgebung nicht gestartet werden kann. Hinweistext,
  19.        wie die Windows-Anwendung in Windows gestartet werden kann.
  20.  
  21.  MyStub kann idR den Std-Stub ersetzen; in TurboPascal für Windows/
  22.  Borland-Pascal kann das Tool GLUE verwendet werden, um den neuen
  23.  Stub zu setzen.
  24.  ********************************************************************)
  25.  
  26. {$B-;E-;I-;M 10000,16000;S-;V-;X+}
  27.  
  28. program MyStub;
  29.  
  30. uses
  31.     Crt, Dos, Strings, Token;
  32.  
  33. const
  34.     CRLF = #13#10;
  35.     MinDosVersion = $030A;
  36.     WinDir = 'windir';
  37.     PressKeyMsg = CRLF + 'EINGABETASTE drücken, um zu beenden.';
  38.     TopLine: PChar = '╔════════════════════════════════════════════════════════════════════════════╗';
  39.     BottomLine: PChar = '╚════════════════════════════════════════════════════════════════════════════╝';
  40.     SideFrameChar: PChar = '║';
  41.     WinErrorMsg = '*** Windows läuft!' + CRLF +
  42.                   '    Beenden Sie Windows, bevor Sie SICHDEL erneut starten.';
  43.  
  44. (* testet, ob Windows aktiv ist *)
  45. function WindowsIsRunning: boolean;
  46. var
  47.    i: integer;
  48.    EnvString: string;
  49. begin
  50.      WindowsIsRunning := false;
  51.  
  52.      for i:=1 to EnvCount do
  53.      begin
  54.           EnvString := EnvStr(i);
  55.           if Pos(WinDir, EnvString) > 0 then
  56.              WindowsIsRunning := true;
  57.      end;
  58. end;
  59.  
  60. (* testet, ob min. DOS 3.1 geladen hat *)
  61. function ProperDosVersion: boolean;
  62. var
  63.    DosVer: Integer;
  64. begin
  65.      DosVer := DosVersion;
  66.      DosVer := Swap(DosVer);
  67.      ProperDosVersion := (DosVer >= MinDosVersion);
  68. end;
  69.  
  70. (* gibt Tasten-Drück-Meldung aus, wartet auf Tastendruck und
  71.    beendet dann. *)
  72. procedure WaitForKeyThenQuit(err: integer);
  73. begin
  74.      WriteLn(PressKeyMsg);
  75.      ReadLn;
  76.      Halt(err);
  77. end;
  78.  
  79. (* gibt eine Textzeile mit Rahmen aus *)
  80. procedure FramedTextline(Text: String);
  81. begin
  82.     Write(SideFrameChar);
  83.     Write(Text);
  84.     GotoXY(78, WhereY);
  85.     WriteLn(SideFrameChar);
  86. end;
  87.  
  88. (* akzeptiert nur die Tasteneingabe J oder N; gibt bei J true zurück *)
  89. function FrageJN: boolean;
  90. var
  91.     key: char;
  92. begin
  93.     while KeyPressed do;
  94.     repeat
  95.         key := UpCase(ReadKey);
  96.     until (key = 'J') or (key = 'N');
  97.     Write(key);
  98.     FrageJN := (key = 'J');
  99. end;
  100.  
  101. (* ruft WIN.COM mit allen Pfaden aus - lt. MS muß der Windows-Pfad
  102.    im DOS-Pfad eingetragen sein, so daß die Suche im akt. Verz.
  103.    nicht nötig ist! *)
  104. function ExecWindows (Param: String): Integer;
  105. var
  106.     DosErr: Integer;
  107.     Tok: TStrTok;
  108.     OnePath: String[40];
  109. begin
  110.     Tok.Init(GetEnv('PATH'));
  111.     OnePath := Tok.NextToken(';');
  112.     DosErr := 1;
  113.     while (OnePath <> '') and (DosErr <> 0) do
  114.     begin
  115.         Exec(OnePath + '\win.com', Param);
  116.         DosErr := DosError;
  117.         OnePath := Tok.NextToken(';');
  118.     end;
  119.     Tok.Done;
  120.     ExecWindows := DosErr;
  121. end;
  122.  
  123. var
  124.     Modulename: NameStr;    (* Name der EXE ohne Pfad und Extension *)
  125.     Dir: DirStr;
  126.     Ext: ExtStr;
  127.     ErrCode: Integer;
  128.  
  129. begin
  130.     if WindowsIsRunning then
  131.     begin
  132.         WriteLn('Bitte starten Sie diese Windows-Anwendung nicht innerhalb');
  133.         WriteLn('einer Windows-DOS-Box!');
  134.         WriteLn;
  135.         WriteLn('Um dieses Programm in Windows zu starten, wechseln Sie bitte');
  136.         WriteLn('in Ihren Programm-Manager und wählen Sie dort den Menübefehl');
  137.         WriteLn('''Datei->Ausführen''. Geben Sie ', ParamStr(0), ' als');
  138.         WriteLn('Programm-Name an.');
  139.         WaitForKeyThenQuit(3);
  140.     end;
  141.  
  142.     FSplit(ParamStr(0), Dir, Modulename, Ext);
  143.     WriteLn(TopLine);
  144.     FramedTextline('HINWEIS!');
  145.     FramedTextline('');
  146.     FramedTextline(Modulename + ' ist eine Windows-Anwendung und muß deswegen unter der');
  147.     FramedTextline('graphischen Oberfläche von Microsoft(tm) Windows(tm), Version 3.1 oder');
  148.     FramedTextline('höher, ausgeführt werden!');
  149.     WriteLn(BottomLine);
  150.  
  151.     if not ProperDosVersion then
  152.     begin
  153.         WriteLn;
  154.         WriteLn('Leider befindet sich auf Ihrem Rechner eine zu alte DOS-Version,');
  155.         WriteLn('um Microsoft(tm) Windows(tm) 3.1 oder höher ausführen zu können.');
  156.         WriteLn;
  157.         WriteLn('Sie benötigen MS-DOS(tm) Version 3.1 oder höher, um Microsoft(tm)');
  158.         WriteLn('Windows(tm) 3.1 ausführen zu können. Bitte besorgen Sie sich ein Update.');
  159.         WriteLn;
  160.         WriteLn('Schade eigentlich...');
  161.     end else begin
  162.         WriteLn('Soll Microsoft(tm) Windows(tm) jetzt gestartet werden,');
  163.         Write('um ', Modulename, ' auszuführen? (J/N) ');
  164.         if FrageJN then
  165.         begin
  166.             WriteLn;
  167.             WriteLn('OK - starte win ', ParamStr(0), '...');
  168.             SwapVectors;
  169.             ErrCode := ExecWindows(ParamStr(0));
  170.             SwapVectors;
  171.             WriteLn;
  172.  
  173.             if ErrCode <> 0 then
  174.             begin
  175.                 WriteLn('*** DOS lieferte Fehler Nr. ', ErrCode);
  176.                 Halt(4);
  177.             end;
  178.         end;
  179.     end;
  180. end.