typelibdump.cpp

来自「这是VCF框架的代码」· C++ 代码 · 共 1,248 行 · 第 1/3 页

CPP
1,248
字号
		                          (void**) &pIUnknown );	IDispatch* pIDisp = NULL;	hr = pIUnknown->QueryInterface( IID_IDispatch, (void**)&pIDisp );	if ( SUCCEEDED(hr) ) {		ITypeInfo* pTypeInfo = NULL;		ITypeLib* pTypeLib = NULL;			UINT hasInfo = 0;		hr = pIDisp->GetTypeInfoCount( &hasInfo );		if ( hasInfo ) {			hr = pIDisp->GetTypeInfo( 0, 0, &pTypeInfo );			if ( SUCCEEDED(hr) ) {				UINT index = 0;				hr = pTypeInfo->GetContainingTypeLib( &pTypeLib, &index );				pTypeInfo->Release();				pTypeInfo = NULL;				if ( SUCCEEDED(hr) ) {										hr = pTypeLib->GetTypeInfoOfGuid( clsid, &pTypeInfo );						_bstr_t typeDefs = GenerateClassTypeDefs( pTypeLib, 1 );					body += typeDefs;					body += "\n\n";					TYPEATTR*   pattr = NULL ;					hr = pTypeInfo->GetTypeAttr( &pattr);					BSTR            bstrName = NULL ;					BSTR            bstrDoc = NULL ;					BSTR            bstrHelp = NULL ;					DWORD           dwHelpID ;					ITypeInfo*      ptiImpl = NULL ;					TYPEATTR*       pattrImpl = NULL ;					pTypeInfo->GetDocumentation( MEMBERID_NIL, &bstrName, &bstrDoc, &dwHelpID, &bstrHelp );					for (UINT n = 0 ; n < pattr->cImplTypes ; n++)	{						int impltype = 0;						HREFTYPE href = NULL ;						hr = pTypeInfo->GetImplTypeFlags( n, &impltype );						hr = pTypeInfo->GetRefTypeOfImplType(n, &href);						hr = pTypeInfo->GetRefTypeInfo( href, &ptiImpl );						hr = ptiImpl->GetDocumentation( MEMBERID_NIL, &bstrName, &bstrDoc, &dwHelpID, &bstrHelp );						_bstr_t interfaceName = bstrName;						//printf( "Interface \"%s\"\n", (char*)interfaceName);						hr = ptiImpl->GetTypeAttr( &pattrImpl);						switch ( pattrImpl->typekind ) {							case TKIND_ENUM:							case TKIND_RECORD:							case TKIND_UNION:							case TKIND_ALIAS: {															}							break;							case TKIND_INTERFACE: {								OLECHAR guidStr[256];								StringFromGUID2( pattrImpl->guid, guidStr, 256 );								body += "\t// generated methods for interface ";								body += interfaceName;								body += " (guid: ";								body += guidStr;								body += ")\n";								for (UINT i = 0 ; i < pattrImpl->cFuncs ; i++)	{																		body += "\t";									body += GenerateClassMethod( ptiImpl, i );									body += "\n\n";								}							}							break;							case TKIND_DISPATCH: {								OLECHAR guidStr[256];								StringFromGUID2( pattrImpl->guid, guidStr, 256 );								body += "\t// generated methods for dispatch interface ";								body += interfaceName;								body += " (guid: ";								body += guidStr;								body += ")\n";								for (UINT i = 0 ; i < pattrImpl->cFuncs ; i++)	{																		body += "\t";									body += GenerateClassMethod( ptiImpl, i );									body += "\n\n";								}							}							break;						}						ptiImpl->Release();					}					pTypeInfo->ReleaseTypeAttr( pattr );					pTypeInfo->Release();				}			}		}		pIDisp->Release();	}	pIUnknown->Release();	body += "};\n";	return body.copy();}/*int main(int argc, char* argv[]){	IStream*    pstm = NULL ;	//pstm = CreateMemoryStream() ;	//_com_ptr_t obj;	OleInitialize( 0 );	CLSID clsid;	_bstr_t progID( "OWC.Pivottable.9" );//"DHTMLEdit.DHTMLEdit" );	HRESULT hr = CLSIDFromProgID( (LPOLESTR)progID, &clsid );		if ( SUCCEEDED(hr) ) {		_bstr_t classBody = GenerateClassHeaderFromCOMCLSID( clsid );							printf( "%s", (char*)classBody );	}	OleUninitialize();		return 0;}*/CoClassHolder::~CoClassHolder(){		m_implementedInterfaces.clear();}InterfaceHolder::~InterfaceHolder(){	std::vector<MethodHolder*>::iterator it = m_methods.begin();	while ( it != m_methods.end() ) 	{		MethodHolder* mh = *it;		delete mh;		mh = NULL;		it ++;	}	m_methods.clear();}TypeLibHolder::~TypeLibHolder(){	std::vector<CoClassHolder*>::iterator it = m_coClasses.begin();	while ( it != m_coClasses.end() ) 	{		CoClassHolder* ch = *it;		delete ch;		ch = NULL;		it ++;	}	m_coClasses.clear();	std::map<_bstr_t,InterfaceHolder*>::iterator it2 = m_interfaces.begin();	while ( it2 != m_interfaces.end() ) 	{		InterfaceHolder* ih = it2->second;		delete ih;		ih = NULL;		it2 ++;	}	m_interfaces.clear();}HRESULT GenerateTypeLibHolder( ITypeLib* pTypeLib, TypeLibHolder& typeLibHolder ){	HRESULT hr = E_FAIL;	typeLibHolder.m_typeDefs = GenerateClassTypeDefs( pTypeLib, 1 );	BSTR            bstrName = NULL ;	BSTR            bstrDoc = NULL ;	BSTR            bstrHelp = NULL ;	DWORD           dwHelpID ;	hr = pTypeLib->GetDocumentation( MEMBERID_NIL, &bstrName, &bstrDoc, &dwHelpID, &bstrHelp ) ;		typeLibHolder.m_typeLibName = bstrName;	SysFreeString(bstrName) ;	SysFreeString( bstrDoc ) ;	SysFreeString( bstrHelp ) ;	_bstr_t indentStr = "";	int indent = 0;	for ( int i=0;i<indent;i++){		indentStr += "\t";	}	int tic = pTypeLib->GetTypeInfoCount();	for (int ti=0;ti<tic;ti++) {		ITypeInfo* pTypeInfo = NULL;		hr = pTypeLib->GetTypeInfo( ti, &pTypeInfo );		if ( SUCCEEDED(hr) ) {			TYPEATTR*   pTypeAttr = NULL ;			hr = pTypeInfo->GetTypeAttr( &pTypeAttr);						switch ( pTypeAttr->typekind ) {				case TKIND_COCLASS: {													hr = pTypeInfo->GetDocumentation( MEMBERID_NIL, &bstrName, &bstrDoc, &dwHelpID, &bstrHelp );					_bstr_t coClassName = bstrName;					SysFreeString(bstrName) ;					SysFreeString( bstrDoc ) ;					SysFreeString( bstrHelp ) ;					OLECHAR guidStr[256];					StringFromGUID2( pTypeAttr->guid, guidStr, 256 );					CoClassHolder* newCoClass = new CoClassHolder();					newCoClass->m_className = coClassName;					newCoClass->m_classID = guidStr;					for (UINT n = 0 ; n < pTypeAttr->cImplTypes ; n++)	{						ITypeInfo*      ptiImpl = NULL ;						int impltype = 0;						TYPEATTR*       pattrImpl = NULL ;						HREFTYPE href = NULL ;						hr = pTypeInfo->GetImplTypeFlags( n, &impltype );						hr = pTypeInfo->GetRefTypeOfImplType(n, &href);						hr = pTypeInfo->GetRefTypeInfo( href, &ptiImpl );						hr = ptiImpl->GetTypeAttr( &pattrImpl);						hr = ptiImpl->GetDocumentation( MEMBERID_NIL, &bstrName, &bstrDoc, &dwHelpID, &bstrHelp );						switch ( pattrImpl->typekind ) {							case TKIND_INTERFACE: case TKIND_DISPATCH: {								_bstr_t tmp = bstrName;								SysFreeString(bstrName) ;								SysFreeString( bstrDoc ) ;								SysFreeString( bstrHelp ) ;								std::map<_bstr_t,InterfaceHolder*>::iterator found = 									typeLibHolder.m_interfaces.find( tmp );								InterfaceHolder* newInterface = NULL;								if ( found != typeLibHolder.m_interfaces.end() ) {									newInterface = found->second;									typeLibHolder.m_interfaces[tmp] = newInterface;								}								else {									newInterface = new InterfaceHolder();														GenerateInterface( ptiImpl, pattrImpl, newInterface );								}																newCoClass->m_implementedInterfaces.push_back( newInterface );															}							break;						}					}					typeLibHolder.m_coClasses.push_back( newCoClass );				}				break;				case TKIND_INTERFACE: case TKIND_DISPATCH: {										InterfaceHolder* newInterface = new InterfaceHolder();										hr = GenerateInterface( pTypeInfo, pTypeAttr, newInterface );					_bstr_t tmp = newInterface->m_interfaceName;					typeLibHolder.m_interfaces[tmp] = newInterface;				}				break;			}		}	}	return hr;}HRESULT GenerateMethod( ITypeInfo* pMethodTypeInfo, long methodID, MethodHolder* pMethod ){	HRESULT hr = E_FAIL;	_bstr_t method;		FUNCDESC*   pfuncdesc = NULL ;	BSTR            rgbstrNames[MAX_NAMES] ;	BSTR            bstrName = NULL ;	BSTR            bstrDoc = NULL ;	BSTR            bstrHelp = NULL ;	DWORD           dwHelpID ;	for (UINT ui = 0 ; ui < MAX_NAMES ; ui++)		rgbstrNames[ui] = NULL ;	hr = pMethodTypeInfo->GetFuncDesc( methodID, &pfuncdesc );	hr = pMethodTypeInfo->GetDocumentation( pfuncdesc->memid, &bstrName, &bstrDoc, &dwHelpID, &bstrHelp );	UINT cNames = 0 ;	hr = pMethodTypeInfo->GetNames( pfuncdesc->memid, rgbstrNames, MAX_NAMES, &cNames );			pMethod->m_returnType = TYPEDESCtoString( pMethodTypeInfo, &pfuncdesc->elemdescFunc.tdesc );			if (pfuncdesc->invkind & INVOKE_PROPERTYGET) {		cNames --;		pMethod->m_isPropertyGetter = true;	}	else if ((pfuncdesc->invkind & INVOKE_PROPERTYPUT) || (pfuncdesc->invkind & INVOKE_PROPERTYPUTREF)) {				pMethod->m_isPropertySetter = true;	}	pMethod->m_methodName = rgbstrNames[0];	method += rgbstrNames[0];	method += "( ";		for ( int p=0;p<pfuncdesc->cParams;p++) {		bool paramIsPointer = false;		if ( pfuncdesc->lprgelemdescParam ) {			if ( pfuncdesc->lprgelemdescParam[p].idldesc.wIDLFlags ) {				if (pfuncdesc->lprgelemdescParam[p].idldesc.wIDLFlags & IDLFLAG_FOUT) {					paramIsPointer = true;				}				if (pfuncdesc->lprgelemdescParam[p].idldesc.wIDLFlags & IDLFLAG_FRETVAL) {					paramIsPointer = true;				}								if ((pfuncdesc->lprgelemdescParam[p].tdesc.vt & 0x0FFF) == VT_CARRAY) {					_bstr_t val = TYPEDESCtoString( pMethodTypeInfo, &pfuncdesc->lprgelemdescParam[p].tdesc.lpadesc->tdescElem );				}				else {					_bstr_t type = TYPEDESCtoString( pMethodTypeInfo, &pfuncdesc->lprgelemdescParam[p].tdesc );					_bstr_t paramName = rgbstrNames[p+1];																			method += type;					method += " ";					if ( paramName.length() == 0 ) {						paramName = "Val";					}					method += paramName;										if ( p!=(pfuncdesc->cParams-1) ) {						method += ", ";					}					MethodArgumentHolder methodArg( type, paramName );					pMethod->m_arguments.push_back( methodArg );				}			}		}	}	method += " )";	pMethod->m_declaration = method;	TCHAR methIDStr[256];	memset( methIDStr, 0, 256 );	sprintf( methIDStr, "%d", pfuncdesc->memid );	pMethod->m_methodID = methIDStr;	for (ui = 0 ; ui < MAX_NAMES ; ui++) {		if (rgbstrNames[ui]) {			SysFreeString(rgbstrNames[ui]) ;		}	}	SysFreeString(bstrName) ;	SysFreeString( bstrDoc ) ;	SysFreeString( bstrHelp ) ;	pMethodTypeInfo->ReleaseFuncDesc( pfuncdesc ) ;			return hr;}HRESULT GenerateInterface( ITypeInfo* pTypeInfo, TYPEATTR* pTypeAttr, InterfaceHolder* pInterface ){	HRESULT hr = E_FAIL;	BSTR            bstrName = NULL ;	BSTR            bstrDoc = NULL ;	BSTR            bstrHelp = NULL ;	DWORD           dwHelpID ;		hr = pTypeInfo->GetDocumentation( MEMBERID_NIL, &bstrName, &bstrDoc, &dwHelpID, &bstrHelp );	_bstr_t interfaceName = bstrName;	OLECHAR guidStr[256];	StringFromGUID2( pTypeAttr->guid, guidStr, 256 );		SysFreeString(bstrName) ;	SysFreeString( bstrDoc ) ;	SysFreeString( bstrHelp ) ;	pInterface->m_interfaceID = guidStr;	pInterface->m_interfaceName = interfaceName;	if ( pTypeAttr->typekind == TKIND_INTERFACE ) {		pInterface->m_superInterfaceName = "IUnknown";	}	else if ( pTypeAttr->typekind == TKIND_DISPATCH ) {		pInterface->m_superInterfaceName = "IDispatch";	}	for (UINT i = 0 ; i < pTypeAttr->cFuncs ; i++)	{								MethodHolder* methodHolder = new MethodHolder();				hr = GenerateMethod( pTypeInfo, i, methodHolder );				CString tmp = (TCHAR*)methodHolder->m_declaration;		//ignore IUnknown and IDispatch methods		int pos = tmp.Find( "AddRef(" );		int pos1 = tmp.Find( "Release(" );		int pos2 = tmp.Find( "QueryInterface(" );		int pos3 = tmp.Find( "GetTypeInfoCount(" );		int pos4 = tmp.Find( "GetTypeInfo(" );		int pos5 = tmp.Find( "GetIDsOfNames(" );		int pos6 = tmp.Find( "Invoke(" );				bool addMethod = ((pos<0) && (pos1<0) && (pos2<0) && (pos3<0) && (pos4<0) && (pos5<0) && (pos6<0));		if ( (true == addMethod) && (SUCCEEDED(hr)) ) {			pInterface->m_methods.push_back( methodHolder );		}		else {			delete methodHolder;		}	}	return hr;}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?