devxlogo

List All the Interfaces Implemented by an Object at Runtime

List All the Interfaces Implemented by an Object at Runtime

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 );	}

devx-admin

Share the Post: