You may have noticed that most of the PROPVARIANT helpers return an HRESULT. This makes them easy to use in conjunction with COM calling patterns like the following:
IPropertyStore pps = ...PROPVARIANT propvar = {0};HRESULT hr = InitPropVariantFromInt32(100, &propvar);if (SUCCEEDED(hr)){ hr = pps->SetValue(PKEY_Rating, propvar); if (SUCCEEDED(hr)) { wprintf(L"Success!\n"); } PropVariantClear(&propvar);}
This works great for functions that already use HRESULTs. But what if you just happen to absolutely know that the only VARTYPE your function will every see will be VT_UI4 every time the function is ever called? Couldn't you just, say, read a member variable directly without checking the VARTYPE? Well, you could, but would you take such a chance with the following helpers available for you to use?
// These will attempt to convert to the desired type, returning the provided default value if that isn't possible:PSSTDAPI_(BOOL) PropVariantToBooleanWithDefault(REFPROPVARIANT propvarIn, BOOL fDefault); // VT_BOOLPSSTDAPI_(SHORT) PropVariantToInt16WithDefault(REFPROPVARIANT propvarIn, SHORT iDefault); // VT_I2PSSTDAPI_(USHORT) PropVariantToUInt16WithDefault(REFPROPVARIANT propvarIn, USHORT uiDefault); // VT_UI2PSSTDAPI_(LONG) PropVariantToInt32WithDefault(REFPROPVARIANT propvarIn, LONG lDefault); // VT_I4PSSTDAPI_(ULONG) PropVariantToUInt32WithDefault(REFPROPVARIANT propvarIn, ULONG ulDefault); // VT_UI4PSSTDAPI_(LONGLONG) PropVariantToInt64WithDefault(REFPROPVARIANT propvarIn, LONGLONG llDefault); // VT_I8PSSTDAPI_(ULONGLONG) PropVariantToUInt64WithDefault(REFPROPVARIANT propvarIn, ULONGLONG ullDefault); // VT_UI8PSSTDAPI_(DOUBLE) PropVariantToDoubleWithDefault(REFPROPVARIANT propvarIn, DOUBLE dblDefault); // VT_R8
PropVariantToStringWithDefault is a little different. It will NOT attempt to make a conversion. It will return a direct pointer to the string data, or the provided default if that isn't possible.
PSSTDAPI_(PCWSTR) PropVariantToStringWithDefault(REFPROPVARIANT propvarIn, __in_opt LPCWSTR pszDefault); // VT_LPWSTR or VT_BSTR
Again, these functions come from propvarutil.h and are implemented in propsys.dll.