Listing your properties...
I'm still working on a managed property system wrapper but after some excellent comments from Ben Karas, we decided to hold off and have a meeting. Something I can show today is how to list all your system properties in native C++:
#ifndef _WIN32_WINNT
#define _WIN32_WINNT 0x0600
#endif
#include <iostream>
#include <iomanip>
#include <objbase.h>
#include <ComDef.h>
#include <ShlObj.h>
#define DECLARE_COM_SMARTPTR(x) _COM_SMARTPTR_TYPEDEF(x, __uuidof(x));
DECLARE_COM_SMARTPTR(IPropertySystem)
DECLARE_COM_SMARTPTR(IPropertyDescriptionList)
DECLARE_COM_SMARTPTR(IPropertyDescription)
using namespace std;
int wmain() {
if FAILED(CoInitializeEx(NULL, COINIT_APARTMENTTHREADED))
return -1;
IPropertySystemPtr propertySystem(__uuidof(PropertySystem));
IPropertyDescriptionListPtr propertyDescriptionList;
propertySystem->EnumeratePropertyDescriptions( PDEF_ALL, IID_PPV_ARGS(& propertyDescriptionList));
UINT count;
propertyDescriptionList->GetCount(& count);
for( UINT i = 0; i < count; i++) {
IPropertyDescriptionPtr propertyDescription;
propertyDescriptionList->GetAt(i, IID_PPV_ARGS(& propertyDescription));
PROPDESC_TYPE_FLAGS mask;
propertyDescription->GetTypeFlags(PDTF_ISINNATE, & mask);
wcout << (mask ? L'R' : L' ') ;
wcout << L"\t\"";
wchar_t * name;
propertyDescription->GetDisplayName(& name);
if (name) {
wcout << name ;
CoTaskMemFree(name);
}
wcout << L"\"\t";
propertyDescription->GetCanonicalName(& name);
if (name) {
wcout << L'(' << name << L")";
CoTaskMemFree(name);
}
wcout << L"\"\t";
VARTYPE vt;
propertyDescription->GetPropertyType(& vt);
wchar_t * type = NULL;
switch (vt & ~VT_VECTOR) {
case VT_NULL: type = L"VT_NULL"; break;
case VT_UI1: type = L"VT_UI1"; break;
case VT_UI2: type = L"VT_UI2"; break;
case VT_UI4: type = L"VT_UI4"; break;
case VT_UI8: type = L"VT_UI8"; break;
case VT_I2: type = L"VT_I2"; break;
case VT_I4: type = L"VT_I4"; break;
case VT_I8: type = L"VT_I8"; break;
case VT_R8: type = L"VT_R8"; break;
case VT_BOOL: type = L"VT_BOOL"; break;
case VT_FILETIME: type = L"VT_FILETIME"; break;
case VT_CLSID: type = L"VT_CLSID"; break;
case VT_LPWSTR: type = L"VT_LPWSTR"; break;
case VT_BLOB: type = L"VT_BLOB"; break;
case VT_STREAM: type = L"VT_STREAM"; break;
case VT_CF: type = L"VT_CF"; break;
}
if (type) {
if (vt & VT_VECTOR) {
wcout << L"VT_VECTOR |";
}
wcout << L' ' << type;
} else {
wcout << vt ;
}
wcout << L"\t";
PROPERTYKEY propertyKey;
propertyDescription->GetPropertyKey(& propertyKey);
wcout << L'{';
GUID & g = propertyKey.fmtid;
wcout << hex
<< showbase
<< L'{' << g.Data1 << L","
<< g.Data2 << L","
<< g.Data3 << L",{"
<< g.Data4[0] << L","
<< g.Data4[1] << L","
<< g.Data4[2] << L","
<< g.Data4[3] << L","
<< g.Data4[4] << L","
<< g.Data4[5] << L","
<< g.Data4[6] << L","
<< g.Data4[7] << L"}}"
<< L","
<< propertyKey.pid << L'}'
<< dec << noshowbase ;
wcout << endl;
}
CoUninitialize();
return 0;
}
On my box, I have 845 properties! Enjoy et à demain si on le veut bien…