All you need is a simple class that asks your object for each known interface. Here’s the class QI:
#include #include #include class QI : public std::stringstream, protected CRegKey{protected: virtual std::string Query( IUnknown* pUnk ) { if ( pUnk != NULL && ( ERROR_SUCCESS == Open( HKEY_CLASSES_ROOT,"Interface" ) ) ) { TCHAR szKeyName[1024] = ""; for ( int i = 0; ERROR_SUCCESS == RegEnumKey( m_hKey, i, szKeyName,sizeof(szKeyName) ); i++ ) { USES_CONVERSION; CLSID clsID = CLSID_NULL; if ( SUCCEEDED( CLSIDFromString( T2OLE(szKeyName), &clsID ) ) ) { CComPtr spObject = NULL; if ( SUCCEEDED( pUnk->QueryInterface( clsID, (void**)&spObject ) ) ) { TCHAR szValue[1024] = ""; LONG ncbValue = sizeof(szValue); if ( ERROR_SUCCESS == RegQueryValue( m_hKey, szKeyName, szValue,&ncbValue ) ) *this
So, when your object needs to be inspected, call:
QI::MsgBox( object ).
Here's an example using the OleCreateFontIndirect API:
USES_CONVERSION; FONTDESC font = { sizeof(FONTDESC), T2OLE("Tahoma"), FONTSIZE(8),FW_NORMAL, DEFAULT_CHARSET, FALSE, FALSE, FALSE }; CComPtr spFont; if ( SUCCEEDED( OleCreateFontIndirect( &font, IID_IFontDisp,(void**)&spFont ) ) ) { QI::MsgBox( spFont ); }