[fpc-pascal] GetClipboardFormatName causing an Error 216

James Richters james.richters at productionautomation.net
Thu Dec 31 01:09:38 CET 2020


I'm trying to write a programs to get data from the windows clipboard that
was put into it with Notepad++ using vertical editing.
It uses a non-standard format and I'm trying to figure it out.
GetClipboardFormatName is supposed to get me the name of non-standard
formats,
but whenever I try to run it, I get a runtime error 216

I found some python code at: https://gist.github.com/adam-p/2514182 that I'm
trying to convert to FPC.  
My fork is at:
https://gist.github.com/Zaaphod/7d94e1d712a5b9ac2bcb0bc79f039a63 Which shows
both the original python code and my FPC attempt

It works fine for standard formats:

Running "i:\programming\gcode\test\clipboard formats.exe "
Number of formats: 4
13 CF_UNICODETEXT
16 CF_LOCALE
1 CF_TEXT
7 CF_OEMTEXT

But if I highlight some text in Notepadd++ using vertical editing, holding
down Shift and ALT while using the arrow keys to highlight a block of text, 
and the copy that to the clipboard, I get the following:

Running "i:\programming\gcode\test\clipboard formats.exe "
Number of formats: 6
13 CF_UNICODETEXT
49882
Runtime error 216 at $774C246C
  $774C246C
  $76932F63
  $76932EB7
  $004017EC  main,  line 60 of i:/programming/gcode/test/clipboard
formats.pas
  $00408F67

Line 60 is:
               GetClipboardFormatName(Format_Id,FN,250);

It only gets run for non-standard formats.  As I understand it that's all it
us supposed to be used for.

It's pretty short program so I pasted it below.

Any ideas on what I'm doing wrong here?

James

---------------------------------------------


uses
   Windows,strings;
Type
   BT = Record
      BT_ID: Byte;
      BT_Name: String;
   End;

Const
builtin_type: Array [0..22] of BT = (
{ 0} (BT_ID:2   ;BT_Name:'CF_BITMAP'         ),
{ 1} (BT_ID:8   ;BT_Name:'CF_DIB'            ),
{ 2} (BT_ID:17  ;BT_Name:'CF_DIBV5'          ),
{ 3} (BT_ID:5   ;BT_Name:'CF_DIF'            ),
{ 4} (BT_ID:130 ;BT_Name:'CF_DSPBITMAP'      ),
{ 5} (BT_ID:142 ;BT_Name:'CF_DSPENHMETAFILE' ),
{ 6} (BT_ID:131 ;BT_Name:'CF_DSPMETAFILEPICT'),
{ 7} (BT_ID:129 ;BT_Name:'CF_DSPTEXT'        ),
{ 8} (BT_ID:14  ;BT_Name:'CF_ENHMETAFILE'    ),
{ 9} (BT_ID:15  ;BT_Name:'CF_HDROP'          ),
{10} (BT_ID:16  ;BT_Name:'CF_LOCALE'         ),
{11} (BT_ID:18  ;BT_Name:'CF_MAX'            ),
{12} (BT_ID:3   ;BT_Name:'CF_METAFILEPICT'   ),
{13} (BT_ID:7   ;BT_Name:'CF_OEMTEXT'        ),
{14} (BT_ID:128 ;BT_Name:'CF_OWNERDISPLAY'   ),
{15} (BT_ID:9   ;BT_Name:'CF_PALETTE'        ),
{16} (BT_ID:10  ;BT_Name:'CF_PENDATA'        ),
{17} (BT_ID:11  ;BT_Name:'CF_RIFF'           ),
{18} (BT_ID:4   ;BT_Name:'CF_SYLK'           ),
{19} (BT_ID:1   ;BT_Name:'CF_TEXT'           ),
{20} (BT_ID:6   ;BT_Name:'CF_TIFF'           ),
{21} (BT_ID:13  ;BT_Name:'CF_UNICODETEXT'    ),
{22} (BT_ID:12  ;BT_Name:'CF_WAVE'           ));

Var
   i,j,Number_Of_Formats : Byte;
   Format_ID : DWord;
   FN : LPTSTR;
   Format_Name : String;

Begin
   FN:=StrAlloc (255);
   OpenClipboard(0);
   Number_Of_Formats := CountClipboardFormats();
   Writeln('Number of formats: ',Number_Of_Formats);
   format_id := 0;
   for i := 1 to Number_Of_Formats do
      Begin
         Format_Name := 'FAILED';
         Format_ID:=EnumClipboardFormats(Format_ID);
         For J:= 0 to 22 do
            Begin
               If Format_ID = builtin_type[J].BT_ID then
                  Format_Name := builtin_type[J].BT_Name;
            End;
         If Format_Name = 'FAILED' Then
            Begin
               FN:='';
               Writeln(Format_ID);
               GetClipboardFormatName(Format_Id,FN,250);
               Writeln(FN);
               
               If strpas(FN) <> '' Then
                  Format_Name := StrPas(FN);
            End;
         Writeln(Format_ID,' ',Format_Name);
     End;
CloseClipboard();
End.



More information about the fpc-pascal mailing list