typelibraryconverterdlg.cpp

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

CPP
1,668
字号
	header += "#define ";	header += s;	header += "\n\n";	header += "#include \"FoundationKit.h\"\n\n";	header += "\n\nusing namespace VCF;\n\n";	if ( TRUE == this->m_useTLBAsNamespace ) {		header += "namespace ";		header += pTypeLibHolder->m_typeLibName;		header += "  {\n\n";	}		std::map<_bstr_t,InterfaceHolder*>::iterator it = pTypeLibHolder->m_interfaces.begin();	while ( it != pTypeLibHolder->m_interfaces.end() ) {		InterfaceHolder* pInterface = it->second;		header += GenerateInterface( pInterface, pTypeLibHolder );		it++;	}		if ( TRUE == this->m_useTLBAsNamespace ) {		header += "}  //end of namespace ";		header += pTypeLibHolder->m_typeLibName;		header += "\n\n";	}		header += "#endif //";	header += s;		header += "\n\n";		headerFileName = m_headerDir;	headerFileName += pTypeLibHolder->m_typeLibName;	headerFileName += "Interfaces.h";	headerFile.Open( headerFileName, CFile::modeCreate | CFile::modeWrite );	headerFile.WriteString( header.GetBuffer(0) );	header.ReleaseBuffer();	headerFile.Close();	m_fileList.push_back( headerFileName );		//do coClasses	int coClassCount = pTypeLibHolder->m_coClasses.size();	for ( int i=0;i<coClassCount;i++) {		CoClassHolder* pCoClass = pTypeLibHolder->m_coClasses[i];				header = GenerateCoClassHeader( pCoClass, pTypeLibHolder );				headerFileName = m_headerDir;		headerFileName += pCoClass->m_className;		headerFileName += ".h";		headerFile.Open( headerFileName, CFile::modeCreate | CFile::modeWrite );		headerFile.WriteString( header.GetBuffer(0) );		header.ReleaseBuffer();		headerFile.Close();		m_fileList.push_back( headerFileName );		CString coClassImpl = GenerateCoClassImpl( pCoClass, pTypeLibHolder );				headerFileName = m_cppDir;		headerFileName += pCoClass->m_className;		headerFileName += ".cpp";		headerFile.Open( headerFileName, CFile::modeCreate | CFile::modeWrite );		headerFile.WriteString( coClassImpl.GetBuffer(0) );		coClassImpl.ReleaseBuffer();		headerFile.Close(); 		m_fileList.push_back( headerFileName );	}	CString tlbImpl = GenerateTLBImpl( pTypeLibHolder );	headerFileName = m_cppDir;	headerFileName += pTypeLibHolder->m_typeLibName;	headerFileName += ".cpp";	headerFile.Open( headerFileName, CFile::modeCreate | CFile::modeWrite );	headerFile.WriteString( tlbImpl.GetBuffer(0) );	tlbImpl.ReleaseBuffer();	headerFile.Close();		m_fileList.push_back( headerFileName );}void TypeLibraryConverterDlg::GenerateSingleFileForTLB( TypeLibHolder* pTypeLibHolder ){	CString header;	header += "//";	header += pTypeLibHolder->m_typeLibName.copy();	header += ".h\n\n";	header += "#ifndef ";		CString s = (char*)pTypeLibHolder->m_typeLibName;	s.MakeUpper();	s = "_" + s + "_H__";	header += s.GetBuffer(0);	s.ReleaseBuffer();	header += "\n";	header += "#define ";	header += s.GetBuffer(0);	s.ReleaseBuffer();	header += "\n\n";	header += "#include \"FoundationKit.h\"\n\n";	header += "\n\nusing namespace VCF;\n\n";	if ( TRUE == this->m_useTLBAsNamespace ) {		header += "namespace ";		header += pTypeLibHolder->m_typeLibName;		header += "  {\n\n";	}	header += GenerateClassRegFunction( pTypeLibHolder );	header += "//Typelibrary typedefs\n\n";	header += pTypeLibHolder->m_typeDefs;	header += "\n//End of Typelibrary typedefs\n\n";		UpdateProgress( "Type Defs completed..." );		std::map<_bstr_t,InterfaceHolder*>::iterator it = pTypeLibHolder->m_interfaces.begin();	while ( it != pTypeLibHolder->m_interfaces.end() ) {		InterfaceHolder* pInterface = it->second;		CString uuid = (TCHAR*)pInterface->m_interfaceID;		uuid.Delete(0,1);		uuid.Delete(uuid.GetLength()-1,1);		if ( this->m_useCPPComments ) {			header += "//Interface " + pInterface->m_interfaceName + "\n";			header += "//UUID: " + uuid + "\n";		}		else {			header += "/**\n";			header += "*Interface " + pInterface->m_interfaceName + "\n";			header += "*UUID: " + uuid + "\n";			header += "*/\n";		}				header += "class " + pInterface->m_interfaceName + " : public VCF::Interface { \n";		header += "public:\n";		header += "\tvirtual ~" + pInterface->m_interfaceName + "(){};\n\n";		CString s;		s += "Adding Interface " + pInterface->m_interfaceName + "...";		UpdateProgress( s );		int methodCount = pInterface->m_methods.size();		for (int i=0;i<methodCount;i++) {			MethodHolder* pMethod = pInterface->m_methods[i];			s = "";			s.Format( "Adding method %d of %d for interface %s", i, methodCount, (char*)pInterface->m_interfaceName );			UpdateProgress( s );			header += this->GenerateMethodComments( pMethod, 1 );			header += "\tvirtual " + pMethod->m_returnType + " ";			if ( pMethod->m_isPropertyGetter ) {				header += this->m_getMethodPrefix;			}			else if ( pMethod->m_isPropertySetter ) {				header += this->m_setMethodPrefix;			}						header += pMethod->m_declaration + " = 0;";						CString siName = (TCHAR*)pInterface->m_superInterfaceName;			if ( siName == "IDispatch" ) {				header += "//[id(" + pMethod->m_methodID + ")]";			}			header += "\n\n";		}		header += "};\n\n\n";		it++;	}					int coClassCount = pTypeLibHolder->m_coClasses.size();	for ( int i=0;i<coClassCount;i++) {		CoClassHolder* pCoClass = pTypeLibHolder->m_coClasses[i];				CString uuid = (TCHAR*)pCoClass->m_classID;		uuid.Delete(0,1);		uuid.Delete(uuid.GetLength()-1,1);		CString coClassName = (TCHAR*)pTypeLibHolder->m_typeLibName;		coClassName += "_" + pCoClass->m_className;		coClassName.MakeUpper();		coClassName += "_CLASSID";		header += "#define " + coClassName + " \t\t\"";		header += uuid + "\"\n";		if ( this->m_useCPPComments ) {			header += "//class " + pCoClass->m_className + "\n";			header += "//UUID: " + uuid + "\n";			header += "//ProgID: " + pCoClass->m_progID + "\n";		}		else {			header += "/**\n";			header += "*class " + pCoClass->m_className + "\n";			header += "*UUID: " + uuid + "\n";			header += "*ProgID: " + pCoClass->m_progID + "\n";			header += "*/\n";		}				header += "class " + pCoClass->m_className + " : public VCF::Object";				CString s;		s += "Adding CoClass " + pCoClass->m_className + "...";		UpdateProgress( s );				int interfaceCount = pCoClass->m_implementedInterfaces.size();		if ( interfaceCount > 0 ) {			header += ", ";		}		for ( int j=0;j<interfaceCount;j++) {			InterfaceHolder* pImplInterface = pCoClass->m_implementedInterfaces[j];			header += "public " + pImplInterface->m_interfaceName;			s = "";			s += "CoClass " + pCoClass->m_className + " implements " + pImplInterface->m_interfaceName;			UpdateProgress( s );			if ( j < (interfaceCount-1) ) {				header += ", ";			}		}		header += " {\n";		header += "public:\n";		header += "\tBEGIN_CLASSINFO( " + pCoClass->m_className + ", \"";		if ( TRUE == this->m_useTLBAsNamespace ) {			header += pTypeLibHolder->m_typeLibName + "::";		}		header += pCoClass->m_className + "\", \"VCF::Object\", ";		header += coClassName + " );\n";		header += "\tEND_CLASSINFO( " + pCoClass->m_className + " );\n\n";		header += "\t" + pCoClass->m_className + "();\n\n";		header += "\tvirtual ~" + pCoClass->m_className + "();\n\n";		for ( j=0;j<interfaceCount;j++) {			InterfaceHolder* pImplInterface = pCoClass->m_implementedInterfaces[j];			int methodCount = pImplInterface->m_methods.size();			for (int m=0;m<methodCount;m++) {				s = "";									s.Format( "Adding method %d of %d for interface %s", m, methodCount, (char*)pImplInterface->m_interfaceName );				UpdateProgress( s );								MethodHolder* pMethod = pImplInterface->m_methods[m];								header += this->GenerateMethodComments( pMethod, 1 );				header += "\tvirtual " + pMethod->m_returnType + " ";				if ( pMethod->m_isPropertyGetter ) {					header += this->m_getMethodPrefix;				}				else if ( pMethod->m_isPropertySetter ) {					header += this->m_setMethodPrefix;				}								header += pMethod->m_declaration + ";";								CString siName = (TCHAR*)pImplInterface->m_superInterfaceName;				if ( siName == "IDispatch" ) {					header += "//[id(" + pMethod->m_methodID + ")]";				}				header += "\n\n";			}		}		header += "};\n\n";			}	if ( TRUE == this->m_useTLBAsNamespace ) {		header += "}  //end of namespace ";		header += pTypeLibHolder->m_typeLibName;		header += "\n\n";	}		header += "#endif //";	header += s.GetBuffer(0);	s.ReleaseBuffer();		header += "\n\n";		CString headerFileName = "foo";	headerFileName = m_headerDir;	headerFileName += pTypeLibHolder->m_typeLibName;	headerFileName += ".h";	CStdioFile headerFile( headerFileName, CFile::modeCreate | CFile::modeWrite );	headerFile.WriteString( header.GetBuffer(0) );	header.ReleaseBuffer();	headerFile.Close();	m_fileList.push_back( headerFileName );	CString tlbImpl = GenerateTLBImpl( pTypeLibHolder );	headerFileName = m_cppDir;	headerFileName += pTypeLibHolder->m_typeLibName;	headerFileName += ".cpp";	headerFile.Open( headerFileName, CFile::modeCreate | CFile::modeWrite );	headerFile.WriteString( tlbImpl.GetBuffer(0) );	tlbImpl.ReleaseBuffer();	headerFile.Close();		m_fileList.push_back( headerFileName );}void TypeLibraryConverterDlg::GenerateSingleFileForIFaceSeparateCoClasses( TypeLibHolder* pTypeLibHolder ){	CString header;	header += "//";	header += pTypeLibHolder->m_typeLibName.copy();	header += "Interfaces.h";	header += ".h\n\n";	header += "#ifndef ";		CString s = (char*)pTypeLibHolder->m_typeLibName;	s += "_Interfaces";	s.MakeUpper();	s = "_" + s + "_H__";	header += s.GetBuffer(0);	s.ReleaseBuffer();	header += "\n";	header += "#define ";	header += s.GetBuffer(0);	s.ReleaseBuffer();	header += "\n\n";	header += "#include \"FoundationKit.h\"\n\n";	header += "\n\nusing namespace VCF;\n\n";	if ( TRUE == this->m_useTLBAsNamespace ) {		header += "namespace ";		header += pTypeLibHolder->m_typeLibName;		header += "  {\n\n";	}	header += GenerateClassRegFunction( pTypeLibHolder );	header += "//Typelibrary typedefs\n\n";	header += pTypeLibHolder->m_typeDefs;	header += "\n//End of Typelibrary typedefs\n\n";			std::map<_bstr_t,InterfaceHolder*>::iterator it = pTypeLibHolder->m_interfaces.begin();	while ( it != pTypeLibHolder->m_interfaces.end() ) {		InterfaceHolder* pInterface = it->second;		header += GenerateInterface( pInterface, pTypeLibHolder );		it++;	}		if ( TRUE == this->m_useTLBAsNamespace ) {		header += "}  //end of namespace ";		header += pTypeLibHolder->m_typeLibName;		header += "\n\n";	}		header += "#endif //";	header += s;		header += "\n\n";		CString headerFileName = m_headerDir;	headerFileName += pTypeLibHolder->m_typeLibName;	headerFileName += "Interfaces.h";	CStdioFile headerFile;	headerFile.Open( headerFileName, CFile::modeCreate | CFile::modeWrite );	headerFile.WriteString( header.GetBuffer(0) );	header.ReleaseBuffer();	headerFile.Close();	m_fileList.push_back( headerFileName );	//do coClasses	int coClassCount = pTypeLibHolder->m_coClasses.size();	for ( int i=0;i<coClassCount;i++) {		CoClassHolder* pCoClass = pTypeLibHolder->m_coClasses[i];				header = GenerateCoClassHeader( pCoClass, pTypeLibHolder );				headerFileName = m_headerDir;		headerFileName += pCoClass->m_className;		headerFileName += ".h";		headerFile.Open( headerFileName, CFile::modeCreate | CFile::modeWrite );		headerFile.WriteString( header.GetBuffer(0) );		header.ReleaseBuffer();		headerFile.Close();		m_fileList.push_back( headerFileName );		CString coClassImpl = GenerateCoClassImpl( pCoClass, pTypeLibHolder );		headerFileName = m_cppDir;		headerFileName += pCoClass->m_className;		headerFileName += ".cpp";		headerFile.Open( headerFileName, CFile::modeCreate | CFile::modeWrite );		headerFile.WriteString( coClassImpl.GetBuffer(0) );		coClassImpl.ReleaseBuffer();		headerFile.Close();		m_fileList.push_back( headerFileName );	}	CString tlbImpl = GenerateTLBImpl( pTypeLibHolder );	headerFileName = m_cppDir;	headerFileName += pTypeLibHolder->m_typeLibName;	headerFileName += ".cpp";	headerFile.Open( headerFileName, CFile::modeCreate | CFile::modeWrite );	headerFile.WriteString( tlbImpl.GetBuffer(0) );	tlbImpl.ReleaseBuffer();	headerFile.Close();		m_fileList.push_back( headerFileName );	}CString TypeLibraryConverterDlg::GenerateTLBImpl( TypeLibHolder* pTypeLibHolder ){	CString result = "";	result += "//" + pTypeLibHolder->m_typeLibName + ".cpp\n\n";	if ( TRUE == m_singleUnitPerClass ) {		result += "#include \"" + pTypeLibHolder->m_typeLibName + ".h\"\n";		result += "#include \"" + pTypeLibHolder->m_typeLibName + "Interfaces.h\"\n";	}	else {				switch ( this->m_fileDistributionType ) {			case SINGLE_FILE_FOR_TLB : {				result += "#include \"" + pTypeLibHolder->m_typeLibName + ".h\"\n";			}			break;			case SINGLE_FILE_FOR_IFACE_COCLASS : {				result += "#include \"" + pTypeLibHolder->m_typeLibName + "Interfaces.h\"\n";			}			break;			case SINGLE_FILE_FOR_IFACE_TYPEDEF_COCLASS : {				result += "#include \"" + pTypeLibHolder->m_typeLibName + "TypeDefs.h\"\n";				result += "#include \"" + pTypeLibHolder->m_typeLibName + "Interfaces.h\"\n";			}			break;		}	}

⌨️ 快捷键说明

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