Holy cow, I wrote a book!
Commenter Ivo wants to know
if the RegisterClipboardFormat function returns a
why is the CLIPFORMAT data type defined to be a
Since a WORD is smaller than a UINT,
you have to stick in a cast every time you assign the result of
RegisterClipboardFormat to a
Rewind to 16-bit Windows.
Back in those days, a UINT and a WORD
were the same size, namely, 16 bits.
As a result, people got lazy about the distinction.
Six of one, a half dozen of the other.
(People are lazy about this sort of distinction even today,
assuming for example that UINT and DWORD
are the same size, and in turn
forcing UINT to remain a 32-bit integer type even on
The RegisterClipboardFormat function came first,
and when the OLE folks wanted to define a friendly name for the data
type to hold a clipboard format, they said,
"Well, a clipboard format is a 16-bit integer, so let me use
a 16-bit integer."
A WORD is a 16-bit integer, so there you go.
This mismatch had no effect in 16-bit code, but once Win32 showed up,
you had a problem since 32-bit Windows expanded the UINT
type to 32 bits.
Not only does keeping a CLIPFORMAT in a WORD
create the need for all this casting,
it also leaves two bytes of padding in the
Yeah, basically, it sucks.