Holy cow, I wrote a book!
Starting with the Windows Vista PlatformSDK, defining the symbol STRICT_TYPED_ITEMIDS before including shell header files changes declarations that previously had simply used ITEMIDLIST now use one of various types which are more clear about what type of ID list is being used.
STRICT_TYPED_ITEMIDS
ITEMIDLIST
Think of it as the STRICT macro for the shell.
STRICT
The more precise names emphasize the form of the ID list:
ITEMID_CHILD
SHITEMID
IDLIST_RELATIVE
IShellFolder
IDLIST_ABSOLUTE
SHGetDesktopFolder
ITEMID_CHILD_ARRAY
These new types were introduced to help catch common programming errors when using the shell namespace. For example, if you try to pass an array of absolute pidls to IShellFolder::GetUIObjectOf, you will get a type mismatch compiler error because that method takes an ITEMID_CHILD_ARRAY, and the thing you passed is not an array of ITEMID_CHLD pointers.
IShellFolder::GetUIObjectOf
ITEMID_CHLD
You are encouraged to turn on strict mode when compiling code that uses the shell namespace, but to preserve source code backward compatibility, the setting is off by default.