[Back to DOS SWAG index] [Back to Main SWAG index] [Original]

    {
     LG> I am trying to write a routine using PKZIP.  I can get it to work
     LG> except I am having a problem using the -z <comment.fil option with
     LG> EXEC.
    the trouble is that the exec procedure doesn't support redirection of standard
    input and standard output devices using the ">" and "<" chars, i.e. PKZIP
    usually expects the comment to come from the "STDIN" standard input device
    which normally is the keyboard. and with <MYBANNER.TXT from the commandline
    you redirect the STDIN to the file MYBANNER.TXTSo you have to do the
    redirection yourself ;)
    That's how it works:

    (The STDIN file handle is always handle #0.)
    1. copy this STDIN handle into a new one (to restore it afterwards)
    2. open your redirection file
    3. force the duplication of your redirection file's handle into the
       STDIN handle #0 (and close the redirection file's hadle)
    4. the STDIN handle now no longer refers to the keyboard, but to your
       redirection file. Run EXEC without the "<blabla..." stuff.
    5. restore the old STDIN handle by forcing the duplication of your
       saved handle (from 1.) into handle 0.

    hey, don't worry .. i did it for you ;)
    i did a little error handling .. but it still could not work if there are too
    few free file handles .. but this usually doesn't happen ;) and if it happens,
    increase your FILES=?? in your CONFIG.SYSand if you change it in order to make
    it fit into your prog: remember that ASCIIZfilename must always be declared as
    a global variable!!

    === Cut ===
    {$M 4096, 0, 0}
    program redirection;

    uses dos;

    const STDIN = 0;

    var   error  : boolean;
          ASCIIZfilename : string;

    procedure MyExec(Path, CmdLine, STDINFile : STRING);
    var filehandle     : word;
        dupSTDINhandle : word;
    begin
      asciizfilename := STDINfile + #0;
      error := false;
      asm
        mov ax, 3d00h               {OPEN A FILE}
        mov dx, offset asciizfilename
        inc dx
        int 21h
        jnc @noerror
        mov error, 1
       @noerror:
        mov filehandle, ax
      end;
      if error then begin
        writeln('redirection file not found!');
        exit;
      end;
      asm
        mov ah, 45h
        mov bx, STDIN  {set bx to 0 = STDIN handle}
        int 21h        {DUPLICATE FILE HANDLE}
        jnc @noerror2
        mov error, 1
       @noerror2:
        mov dupSTDINhandle, ax
      end;
      if error then begin
        writeln('cannot duplicate STDIN handle');
        asm
          mov ah, 3eh   {CLOSE FILE}
          mov bx, filehandle
          int 21h
        end;
        exit;
      end;
      asm
        mov ah, 46h      {FORCE DUPLICATE HANDLE}
        mov bx, filehandle
        mov cx, STDIN
        int 21h
        mov ah, 3eh      {CLOSE FILE}
        mov bx, filehandle
        int 21h
      end;
      swapvectors;
      exec(Path, CmdLine);
      swapvectors;
      asm
        mov ah, 46h      {FORCE DUPLICATE HANDLE}
        mov bx, dupSTDINhandle
        mov cx, STDIN
        int 21h
        mov ah, 3eh      {CLOSE FILE}
        mov bx, dupSTDINhandle
        int 21h
      end;
    end;

    begin
      myexec('PKZIP.EXE', 'MYZIP.ZIP -z', 'MYCOMMENT.TXT');
    end.

[Back to DOS SWAG index] [Back to Main SWAG index] [Original]