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

    {*********** Part 1 *************}
    { Unit includs functions to get access to the Windows-Clipboard }
    { within DOS-Programs, based upon an article in the German      }
    { magazine c't 12/92 p. 242 "Mailbox".                          }
    { Created 01/93, extended 12/96, (c) 1993,96 Dr. Guido Scholz   }

    unit winclip;

    interface

    uses Dos;

    { for protected mode only one function will be exported }
    function ClipboardFunctionsAvailable: boolean; far;

    {$IFNDEF DPMI}
    function ClipboardCompact(lDesired: longint): longint; far;
    function CloseClipboard: boolean; far;
    function EmptyClipboard: boolean; far;
    function GetClipboardDataSize(wFormat: Word): longint; far;
    function GetClipboardData(wFormat: Word; DataPtr: Pointer): boolean; far;
    function OpenClipboard: boolean; far;
    function SetClipboardData(wFormat: Word; DataPtr: Pointer;
      lSize: longint): boolean; far;

    const
      cf_Text      = 1;
      cf_Bitmap    = 2;
      cf_OemText   = 7;
      cf_DspText   = $81;   { Formated Text }
      cf_DspBitmap = $82;
    {$ENDIF}

    implementation

    {$IFDEF DPMI}
    function ClipboardFunctionsAvailable: boolean;
    begin
      ClipboardFunctionsAvailable:= false;
    end;

    {$ELSE}
    function ClipboardFunctionsAvailable: boolean;
    var
      r: registers;
    begin
      r.ax:= $1700;
      intr($2F,r);
      ClipboardFunctionsAvailable:= r.ax <> $1700;
    end;

    function ClipboardCompact(lDesired: longint): longint;
    var
      r: registers;
    begin
      r.ax:= $1709;
      r.si:= Word(lDesired shr 16);
      r.cx:= Word(lDesired);
      intr($2F,r);
      ClipboardCompact:= longint(r.ax) + longint(r.dx) shl 16;
    end;

    function CloseClipboard: boolean;
    var
      r: registers;
    begin
      r.ax:= $1708;
      intr($2F,r);
      CloseClipboard:= r.ax <> 0;
    end;

    function EmptyClipboard: boolean;
    var
      r: registers;
    begin
      r.ax:= $1702;
      intr($2F,r);
      EmptyClipboard:= r.ax <> 0;
    end;

    function GetClipboardDataSize(wFormat: Word): longint;
    var
      r: registers;
    begin
      r.ax:= $1704;
      r.dx:= wFormat;
      intr($2F,r);
      GetClipboardDataSize:= longint(r.ax) + longint(r.dx) shl 16;
    end;

    function GetClipboardData(wFormat: Word; DataPtr: Pointer): boolean;
    var
      r: registers;
    begin
      r.ax:= $1705;
      r.dx:= wFormat;
      r.es:= seg(DataPtr^);
      r.bx:= ofs(DataPtr^);
      intr($2F,r);
      GetClipboardData:= r.ax <> 0;
    end;

    function OpenClipboard: boolean;
    var
      r: registers;
    begin
      r.ax:= $1701;
      intr($2F,r);
      OpenClipboard:= r.ax <> 0;
    end;

    function SetClipboardData(wFormat: Word; DataPtr: Pointer;
      lSize: longint): boolean;
    var
      r: registers;
    begin
      SetClipboardData:= false;
      if (DataPtr <> nil) and (lSize <> 0) then
      if ClipboardCompact(lSize) >= lSize then
      begin
        r.ax:= $1703;
        r.dx:= wFormat;
        r.es:= seg(DataPtr^);
        r.bx:= ofs(DataPtr^);
        r.si:= word(lSize shr 16);
        r.cx:= word(lSize);
        intr($2F,r);
        SetClipboardData:= r.ax <> 0;
      end;
    end;
    {$ENDIF}

    end.

    {*********** Part 2 *************}
    program ClipCopy;
    {Demo for WinClip-Unit}
    {Dr. Guido Scholz 07.12.96}

    uses Crt, Strings, Winclip;

    var
      DerText: PChar;

      { The easiest way is a zero terminated string. Pascal- }
      { strings have to be converted using "StrPCopy".       }

    begin
      if ClipboardFunctionsAvailable then begin { is Windows running ?   }
        DerText:= 'This text will go into the clipboard.';
        if OpenClipboard then begin     { can the clipboard be opend ?   }
          if EmptyClipboard then begin  { can the clipboard be cleared ? }
            SetClipboardData(cf_OemText, DerText, StrLen(DerText)+1);
            {+1 fuer die Terminierung mit #0}
          end else writeln('Error clearing the clipboard.');
          CloseClipboard;
        end else writeln('Error opening the clipboard.');
      end else begin
        writeln('Windows-Clipboard not available.');
        writeln('Run this program in a Windows DOS-Box.');
      end;
      write('Quit ClipCopy with <RETURN>'); readln;
    end.

    {*********** Part 3 *************}
    program ClipPaste;
    { Demo for WinClip-Unit    }
    { Dr. Guido Scholz 07.12.96 }

    uses Crt, Strings, Winclip;

    var
      DerText: PChar;
      Laenge: Longint;

    begin
      if ClipboardFunctionsAvailable then begin { is Windows running ?   }
        if OpenClipboard then begin     { can the clipboard be opend ?   }
          Laenge:= GetClipboardDataSize(cf_OemText);
          if (Laenge > 0) and (Laenge <= 65528) then begin { something useable in cliboard ? }
            GetMem(DerText, Laenge);
            GetClipboardData(cf_OemText, DerText);
            writeln('The following is from the clipbard:');
            writeln(DerText);
            FreeMem(DerText, Laenge);
          end else writeln('No text or too many text inside the clipbard.');
          CloseClipboard;
        end else writeln('Error opening the clipboard.');
      end else begin
        writeln('Windows-Clipboard not available.');
        writeln('Run this program in a Windows DOS-Box.');
      end;
      write('Quit ClipPaste with <RETURN>'); readln;
    end.

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