Holy cow, I wrote a book!
Starting with the Windows Vista PlatformSDK,
defining the symbol
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.
Think of it as the STRICT macro for the shell.
The more precise names emphasize the form of the ID list:
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
you will get a type mismatch compiler error because that method
and the thing you passed is not an array of
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.