When converting C function prototypes to Pascal equivalent declarations, it's important to substitute the C function and argument types with the correct Pascal types. I often use a Type Translation Table for this, like the following in table 1 (optional parts on the C-side are noted between square brackets):
C/C++ Type
ObjectPascal Type
unsigned short [int]
Word
[signed] short [int]
SmallInt
unsigned [int]
Cardinal { 3.25 fix }
[signed] int
Integer
UINT
LongInt { or Cardinal }
WORD
Word
DWORD
LongInt { or Cardinal }
unsigned long
LongInt { or Cardinal }
unsigned long int
LongInt { or Cardinal }
[signed] long
LongInt
[signed] long int
LongInt
char
Char
signed char
ShortInt
unsigned char
Byte
char*
PChar
LPSTR or PSTR
PChar
LPWSTR or PWSTR
PWideChar { 3.12 fix }
void*
Pointer
BOOL
Bool
float
Single
double
Double
long double
Extended
LP,NP,PP,P prefix: if first = T then T becomes P else P prefix
HANDLE
THandle
FARPROC
TFarProc
ATOM
TAtom
TPOINT
TPoint
TRECT
TRect
COLORREF
TColorRef
OFSTRUCT
TOFStruct
DEBUGHOOKINFO
TDebugHookInfo
BITMAP
TBitMap
RGBTRIPLE
TRGBTriple
RGBQUAD
TRGBQuad
BITMAPCOREHEADER
TBitmapCoreHeader
BITMAPINFOHEADER
TBitmapInfoHeader
BITMAPINFO
TBitmapInfo
BITMAPCOREINFO
TBitmapCoreInfo
BITMAPFILEHEADER
TBitmapFileHeader
HANDLETABLE
THandleTable
METARECORD
TMetaRecord
METAHEADER
TMetaHeader
METAFILEPICT
TMetaFilePict
TEXTMETRIC
TTextMetric
NEWTEXTMETRIC
TNewTextMetric
LOGBRUSH
TLogBrush
LOGPEN
TLogPen
PATTERN
TPattern { TLogBrush }
PALETTEENTRY
TPaletteEntry
LOGPALETTE
TLogPalette
LOGFONT
TLogFont
ENUMLOGFONT
TEnumLogFont
PANOSE
TPanose
KERNINGPAIR
TKerningPair
OUTLINETEXTMETRIC
TOutlineTextMetric
FIXED
TFixed
MAT2
TMat2
GLYPHMETRICS
TGlyphMetrics
POINTFX
TPointFX
TTPOLYCURVE
TTTPolyCurve
TTPOLYGONHEADER
TPolygonHeader
ABC
TABC
RASTERIZER_STATUS
TRasterizer_Status
MOUSEHOOKSTRUCT
TMouseHookStruct
CBTACTIVATESTRUCT
TCBTActivateStruct
HARDWAREHOOKSTRUCT
THardwareHookStruct
EVENTMSG
TEventMsg
WNDCLASS
TWndClass
MSG
TMsg
MINMAXINFO
TMinMaxInfo
SEGINFO
TSegInfo
ACCEL
TAccel
PAINTSTRUCT
TPaintStruct
CREATESTRUCT
TCreateStruct
CBT_CREATEWND
TCBT_CreateWnd
MEASUREITEMSTRUCT
TMeasureItemStruct
DRAWITEMSTRUCT
TDrawItemStruct
DELETEITEMSTRUCT
TDeleteItemStruct
COMPAREITEMSTRUCT
TCompareItemStruct
WINDOWPOS
TWindowPos
WINDOWPLACEMENT
TWindowPlacement
NCCALCSIZE_PARAMS
TNCCalcSize_Params
SIZE
TSize
MENUITEMTEMPLATEHEADER
TMenuItemTemplateHeader
MENUITEMTEMPLATE
TMenuItemTemplate
DCB
TDCB
COMSTAT
TComStat
MDICREATESTRUCT
TMDICreateStruct
CLIENTCREATESTRUCT
TClientCreateStruct
MULTIKEYHELP
TMultiKeyHelp
HELPWININFO
THelpWinInfo
CTLSTYLE
TCtlStyle
CTLtype
TCtltype
CTLINFO
TCtlInfo
DDEADVISE
TDDEAdvise
DDEDATA
TDDEData
DDEPOKE
TDDEPoke
DDEAACK
TDDEAck
DEVMODE
TDevMode
KANJISTRUCT
TKanjiStruct
It's also nice to have access to the translation of the special WINDOWS.H types, which is already done by Borland, and can be found in WINTYPES.PAS (it's a rewarding experience to compare these two files with each other - you'll learn a lot about C and Pascal conversion issues).
Now that we've handled the standard built-in (and Windows) types, let's look at the C type definition of WING_DITHER_TYPE that is present in the WING.H file.
typedef enum WING_DITHER_TYPE
{
WING_DISPERSED_4x4,
WING_DISPERSED_8x8,
WING_CLUSTERED_4x4
} WING_DITHER_TYPE;
This is a so -called enumerated type, and can be translated into an ObjectPascal enumerated type very easily:
type
WING_DITHER_TYPE =
(WING_DISPERSED_4x4,
WING_DISPERSED_8x8,
WING_CLUSTERED_4x4);
While most C DLL header files contain only constant definitions (of the form #define XYZ value) and function prototypes, type definitions are also found, and are therefore important to be able to convert.