PropVariantChangeType, aka Mr. Coercion, is the function responsible for all the coercion that goes on in the property system.  It takes a value and attempts to output the same value, but as a different type.  Thus it will convert L"10" to the number 10 and back.

In general, PropVariantChangeType will perform a locale-INsensitive conversion.  This function was intended to operate as part of data layers.  If you need a string you can show the user, use PSFormatForDisplay instead.

PSSTDAPI PropVariantChangeType(__out PROPVARIANT *ppropvarDest, REFPROPVARIANT propvarSrc, PROPVAR_CHANGE_FLAGS flags, VARTYPE vt);

One big difference between PropVariantChangeType and its cousin VariantChangeType is that the PROPVARIANT version will reject many sloppy conversions that VariantChangeType allowed.  For instance, L"xyz" cannot be converted to a number.  Also, an integer cannot be converted to a date. 

Another big different is that PropVariantChangeType avoids locale and attempts to use canonical formats.   For instance, it converts filetimes to L"2006/09/16:20:13:15.001" (the last 001 is the milliseconds).  This makes PropVariantChangeType useful for data layers.

An apology:
We did not invest enough time in this function.  
There are holes in the API.  [Converting a double to a string produces a locale-sensitive format (think L"5,105" in German versus L"5.105" in English].  There is missing functionality.  [Converting ANSI strings to CLSIDs is not supported].  I highly recommend that you test out the scenarios you require of this function.