Login | Register   
LinkedIn
Google+
Twitter
RSS Feed
Download our iPhone app
TODAY'S HEADLINES  |   ARTICLE ARCHIVE  |   FORUMS  |   TIP BANK
Browse DevX
Sign up for e-mail newsletters from DevX


Tip of the Day
Home » Tip Bank » C++
Language: C++
Expertise: Advanced
Oct 11, 2002

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 <atlbase.h>
#include <string>
#include <sstream>
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<IUnknown> 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 << std::string
(szValue) + "\r\n";
					}
				}
			}
			Close();
		}
		return str();
	}

public:
	static void MsgBox( IUnknown* pUnk )
	{
		QI objQI;
		MessageBox( NULL, objQI.Query
( pUnk ).c_str(), "The object implements:",
MB_ICONINFORMATION );
	}
};

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<IFontDisp> spFont;
	if ( SUCCEEDED( OleCreateFontIndirect
( &font, IID_IFontDisp,
(void**)&spFont ) ) )
	{
		QI::MsgBox( spFont );
	}
Mike Filimon
 
Comment and Contribute

 

 

 

 

 


(Maximum characters: 1200). You have 1200 characters left.

 

 

Sitemap
Thanks for your registration, follow us on our social networks to keep up-to-date