home *** CD-ROM | disk | FTP | other *** search
- (* ------------------------------------------------------ *)
- (* SPOOLER.PAS *)
- (* Drucken im Hintergrund über PRINT.COM *)
- (* (c) 1993 te-wi Verlag, München *)
- (* ------------------------------------------------------ *)
- UNIT Spooler;
-
- {$A+,B-,D+,E+,F-,G-,I+,L+,N-,O-,P-,Q+,R+,S+,T-,V+,X+,Y+}
- {$M 16384,0,655360}
-
- INTERFACE
-
- USES Dos;
-
- FUNCTION SpoolerError(Err : WORD) : STRING;
- FUNCTION SpoolerState : BOOLEAN;
- FUNCTION SubmitFile(FName : PathStr) : BOOLEAN;
-
- IMPLEMENTATION
-
- (* Interrupt 2Fh wurde von MS zunächst für das quasi-Multitasking
- des Drucker-Spoolers PRINT.COM unter MS-DOS 3.3 verwendet, der das Drucken
- im Hintergrund erlaubt.
-
- Später haben sich andere Programmierer dieses (undokumentierten) Interrupts
- angenommen -- so die Entwickler des TSR-Standards TesSeRact -- und auch
- Microsoft selbst hat in späteren DOS-Versionen weitere Funktionen des
- Spooler-Interrupts implementiert und dokumentiert. Er heißt nun in der
- offiziellen Dokumentation Multiplexer-Interrupt und ist inzwischen fast
- so wichtig wie der INT 21h. *)
-
- VAR
- Regs : Registers;
- SpoolPack : RECORD
- Level : BYTE;
- Ofset : WORD;
- Segment : WORD;
- END;
-
- (* Die Funktion 01 des Multiplexers erlaubt den Zugriff auf Print.Com.
- Zunächst muß abgefragt werden, ob das resident DOS-Utility überhaupt
- installiert ist.
- Anschließend wird über SubmitFile die zu druckende Datei ans
- Ender der Warteschlange getsellt. Der Dateiname muß aus der vollen Pfadbezeichnung
- bestehen, Wildcards sind nicht erlaubt. *)
-
- FUNCTION SpoolerError(Err : WORD) : STRING;
- VAR
- Msg : STRING;
- BEGIN
- CASE Err OF
- $0001 : Msg := 'unbekannte Funktion';
- $0002 : Msg := 'Datei nicht gefunden';
- $0003 : Msg := 'Pfad nicht gefunden';
- $0004 : Msg := 'zuviele geöffnete Dateien';
- $0005 : Msg := 'Zugriff auf Datei verweigert';
- $0008 : Msg := 'Druckerwarteschlange ist voll';
- $000F : Msg := 'unbekanntes Gerät';
- $00FF : Msg := 'PRINT.COM nicht installiert';
- END;
- END;
-
- FUNCTION SpoolerState : BOOLEAN;
- BEGIN
- Regs.AX := $0100;
- Intr($2F, Regs);
- SpoolerState := (Regs.AL = $FF);
- END;
-
- FUNCTION SubmitFile(FName : PathStr) : BOOLEAN;
- BEGIN
- FillChar(Regs, SizeOf(Registers), $00);
- FName[Length(FName) + 1] := ^@;
- WITH SpoolPack DO BEGIN
- Level := $00;
- Ofset := Ofs(FName) + 1;
- Segment := Seg(FName);
- END;
- Regs.AH := $01;
- Regs.AL := $01;
- Regs.DS := Seg(SpoolPack);
- Regs.DX := Ofs(SpoolPack);
- Intr($2F, Regs);
- SubmitFile:= (Regs.Flags AND $01) = $00;
- END;
-
- END.
- (* ------------------------------------------------------ *)
- (* Ende von SPOOLER.PAS *)
-
-
-
-