Contributor: MARTIN AUSTERMEIER       

{
MARTIN AUSTERMEIER

> PKZIP Filename -Z < zipcomment
> Is there any way to do this WithOUT calling COMSPEC For anothershell?

yes, but much more complicated than leaving the job to %comspec..

Before executing PKZIP, you have to

  * open a Text File
  * get its handle (see TextRec); save it in - say - "newStdIn"
  * then perform something like
  if (newSTDIN <> 0) then begin
    saveHandle[STDIN]:=DosExt.DuplicateHandle (STDIN);
    DosExt.ForceDuplicateHandle (newSTDIN, STDIN);
    created[STDIN]:=True;
  end;
  (DosExt.xx Routines and STDIN Const explained below)

  * Exec()
  * Cancel redirections:
}

Procedure CancelRedirections; { of ExecuteProgram }
Var
  redirCnt : Word;
begin
  For redirCnt := STDIN to STDOUT do
  begin
    if created[redirCnt] then
    begin
      DosExt.ForceDuplicateHandle(saveHandle[redirCnt], redirCnt);
      DosExt.CloseHandle(saveHandle[redirCnt]);
    end;
  end;
end;

Const
  STDIN  = 0;
  STDOUT = 1;
  STDERR = 2;

Procedure CallDos; Assembler;
Asm
  mov Dos.DosError, 0
  Int 21h
  jnc @@Ok
  mov Dos.DosError, ax
 @@Ok:
end;

Function DuplicateHandle(handle : Word) : Word;  Assembler;
Asm
  mov ah, 45h
  mov bx, handle
  call CallDos
  { DuplicateHandle := AX; }
end;

Procedure ForceDuplicateHandle(h1, h2 : Word); Assembler;
Asm
  mov ah, 46h
  mov bx, h1
  mov cx, h2
  call CallDos
end;