⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 vcprojprocess.cpp

📁 将VC7.0和VC.NET的工程转换到VC6.0的工程,内有详细的介绍做法(自己试验后写的)
💻 CPP
📖 第 1 页 / 共 3 页
字号:
				// attribute Filter
				getAttribValue(pElem,XMLATTRIB_RELATIVEPATH,szFilename);

				if (szFilename.IsEmpty()) // try absolute path instead
					getAttribValue(pElem,XMLATTRIB_FULLPATH,szFilename);

				if (szFilename.Find(0,' ')>-1)
					szFilename = "\"" + szFilename + "\"";

				s = "# Begin Source File\r\n\r\n";
				s += "SOURCE=" + szFilename + "\r\n";
				m_outputFile.Write(s);

				// now we need to check the custom configs
				//
				ConfigurationArray arrFileConfigs;
				extractFileConfigurations(pElem, arrFileConfigs);
				writeDspFileConfigurations(szFilename, arrFileConfigs, m_arrConfigs);

				s = "# End Source File\r\n";
				m_outputFile.Write(s);

			}
			else if ( szNodename.CompareNoCase(XMLNODE_FILTER) )// it is a filter
			{
				//
				s = "# Begin Group \"";

				CString szFilterName, szFilter;

				// attribute Name
				getAttribValue(pElem,XMLATTRIB_NAME,szFilterName);

				// attribute Filter
				getAttribValue(pElem,XMLNODE_FILTER,szFilter);

				s += szFilterName + "\"\r\n\r\n";
				m_outputFile.Write(s);

				s = "# PROP Default_Filter \"" + szFilter + "\"\r\n";
				m_outputFile.Write(s);

				// manage all files inside
				//
				writeDspGroup(pElem);

				// finish group of files
				s = "# End Group\r\n";
				m_outputFile.Write(s);
			}
				
		} // end if pNode

	} // end for
}


void vcprojprocess::writeDspFileConfigurations(CString &szFilename, ConfigurationArray &arrFileConfigs, ConfigurationArray &projectConfigs)
{

	// make sure we have anything to output here
	long nConfigNb = arrFileConfigs.GetSize();
	if (nConfigNb==0) return;

	CString s;

	for (long i=0; i<nConfigNb; i++)
	{
		if (i==0)
			s = "\r\n!IF  \"$(CFG)\" == \"";
		else
			s = "!ELSEIF  \"$(CFG)\" == \"";

		vcprojconfiguration *pConfig = arrFileConfigs.GetAt(i);

		CString szConfigName = pConfig->getConfigName();

		s += TranslateConfigurationName( szConfigName ) + "\"\r\n\r\n";

		m_outputFile.Write(s);


		// do we have an intermediate directory
		// 
		CString szIntermediateDirectory;
		szIntermediateDirectory = pConfig->VCCLCompilerTool.GetValue("ObjectFile");
		if (!szIntermediateDirectory.IsEmpty())
		{
			s = "# PROP Intermediate_Dir \"" + szIntermediateDirectory + "\"\r\n";
			m_outputFile.Write(s);
		}


		// do we exclude this file from the build ?
		//
		if ( pConfig->General.GetValue("ExcludedFromBuild").CompareNoCase("TRUE") )
		{
			s = "# PROP Exclude_From_Build 1\r\n\r\n";
			m_outputFile.Write(s);
		}
		else // do we have a custom build, or any standard build tool ?
		{

			// find the equivalent project configuration
			// (debug project configuration, if this file configuration is debug)
			long nbProjConfigs = projectConfigs.GetSize();
			BOOL bFound = FALSE;
			vcprojconfiguration *pProjConfig = NULL;
			for (long iP=0; iP<projectConfigs.GetSize() && !bFound; iP++)
			{
				pProjConfig = projectConfigs.GetAt(iP);
				if (pProjConfig)
				{
					s = pProjConfig->getConfigName();;
					bFound = ( s.CompareNoCase(szConfigName) );
				}
			}
			pConfig->setMasterProjConfigurations( bFound ? pProjConfig : NULL );


			if (pConfig->VCCustomBuildTool.GetValue("Name").IsEmpty()) // standard build
			{

				if ( !pConfig->VCCLCompilerTool.GetValue("Name").IsEmpty() )
				{
					// build compiling symbols line
					//
					CString szCPPSymbols = pConfig->serializeCPPSymbols(TRUE);
					int nPrcmpHeadersTag;
					if ( (nPrcmpHeadersTag=szCPPSymbols.Find(0,"PRECOMP_VC7_TOBEREMOVED"))>-1 )
					{
						szCPPSymbols = szCPPSymbols.Left(nPrcmpHeadersTag) + szCPPSymbols.ExcludeLeft(nPrcmpHeadersTag+strlen("PRECOMP_VC7_TOBEREMOVED")+1);

						s = "# ADD CPP " + szCPPSymbols + "\r\n";
						s += "# SUBTRACT CPP /YX /Yc /Yu\r\n";
					}
					else
						s = "# ADD CPP " + szCPPSymbols + "\r\n";

					m_outputFile.Write(s);
				}
				else if ( !pConfig->VCResourceCompilerTool.GetValue("Name").IsEmpty() )
				{
					// build ResourceCompiler symbol line
					//
					CString szResourceSymbols = pConfig->serializeResourceSymbols(TRUE);
					s = "# ADD RSC " + szResourceSymbols + "\r\n";
					m_outputFile.Write(s);
				}
				else if ( !pConfig->VCMidlTool.GetValue("Name").IsEmpty() )
				{
					// build Midl symbol line
					//
					CString szMidlSymbols = pConfig->serializeMidlSymbols(TRUE);
					s = "# ADD MTL " + szMidlSymbols + "\r\n";
					m_outputFile.Write(s);
				}

			}
			else // custom build
			{
				s = "# PROP Ignore_Default_Tool 1\r\n";
				m_outputFile.Write(s);


				// build CustomBuild cmd line
				//
				CString szCustomBuildDescription;
				ArrayCString arrCustomBuildCommands;
				ArrayCString arrCustomOutputFiles;
				ArrayCString arrAdditionalDeps;
				pConfig->serializeCustomBuildCommands(	szCustomBuildDescription, 
														arrCustomBuildCommands,
														arrCustomOutputFiles,
														arrAdditionalDeps,
														TRUE);


				// custom build (optional)
				if ( arrCustomBuildCommands.GetSize()>0 )
				{
					long j;

					// write user deps
					if (arrAdditionalDeps.GetSize()>0)
					{
						s = "USERDEP_FILE=";

						for (j=0; j<arrAdditionalDeps.GetSize(); j++)
						{
							s += "\"";
							s += arrAdditionalDeps.GetAt(j);
							s += "\"\t";
						}
						s += "\r\n";
						m_outputFile.Write(s);
					}

					s = "# Begin Custom Build - " + szCustomBuildDescription + "\r\n";
					m_outputFile.Write(s);
					s = "SOURCE=\"$(InputPath)\"\r\n"; // don't know why VC++ 6.0 needs this
					m_outputFile.Write(s);
					s = "\r\nBuildCmds= \\\r\n";
					m_outputFile.Write(s);

					for (j=0; j<arrCustomBuildCommands.GetSize(); j++)
					{
						s = "\t";
						s += arrCustomBuildCommands.GetAt(j);
						s += " \\\r\n";
						m_outputFile.Write(s);
					}
					s = "\r\n";
					m_outputFile.Write(s);

					for (j=0; j<arrCustomOutputFiles.GetSize(); j++)
					{
						s = "\r\n\"";
						s += arrCustomOutputFiles.GetAt(j);
						s += "\" : $(SOURCE) \"$(INTDIR)\" \"$(OUTDIR)\"\r\n";
						s += "   $(BuildCmds)\r\n";
						m_outputFile.Write(s);
					}

					s = "# End Custom Build\r\n";
					m_outputFile.Write(s);

					s = "\r\n";
					m_outputFile.Write(s);
				}



			}

		}

	}

	s = "!ENDIF\r\n\r\n";
	m_outputFile.Write(s);

}

void vcprojprocess::writeDspFooter()
{
	CString s ="# End Target\r\n";
	m_outputFile.Write(s);
	s = "# End Project\r\n\r\n";
	m_outputFile.Write(s);
}

// isFullPath -------------------------------
//
// purpose : tells if 'szFilepath' is a fully qualified filepath, or a relative path
BOOL vcprojprocess::isFullPath(CString &szFilepath)
{
	BOOL bResult = TRUE;

	// extract directory
	long i = m_szSolutionName.ReverseFind(0, '\\');
	if (i==-1) return TRUE;

	CString szDirectory = m_szSolutionName.Left(i+1);

	// try to find the file made whose full filepath is "directory"+"finalpath"
	CString szFullfilepath = szDirectory + szFilepath;

	HANDLE hFind;
	WIN32_FIND_DATA fd;

	if ((hFind=::FindFirstFile(szFullfilepath,&fd))==INVALID_HANDLE_VALUE)
	{
		return TRUE;
	}

	::FindClose(hFind);

	return FALSE;
}


void vcprojprocess::getAttribValue(/*in*/IXMLDOMElement *p, /*in*/char *szAttribName, /*out*/CString &szValue)
{
	szValue.Empty();
	if (!p) return;

	VARIANT vtValue;
	p->getAttribute( _bstr_t(szAttribName), &vtValue);
	VARIANT_to_CString( vtValue, szValue);
}

void vcprojprocess::getNodeName(/*in*/IXMLDOMElement *p, /*out*/CString &szName)
{
	szName.Empty();
	if (!p) return;

	BSTR bstrName;
	p->get_nodeName(&bstrName);
	BSTR_to_CString(bstrName,szName);
}


void vcprojprocess::VARIANT_to_CString(/*in*/VARIANT &vt, /*out*/CString &s)
{
	s.Empty();

	if (vt.vt!=VT_BSTR) return;

	_bstr_t bstrTag(vt);

	UINT uLen = bstrTag.length();
	if (uLen==0) return;

	TCHAR *szTemp= new TCHAR[uLen+1];
	memset (szTemp, 0, uLen+1);

	LPOLESTR wszTag = bstrTag; // get ptr to Unicode

	int iBytes = ::WideCharToMultiByte(CP_ACP, 0,
			wszTag, uLen,
			szTemp, uLen, NULL, NULL);

	s = szTemp;

	delete [] szTemp;

	::SysFreeString(vt.bstrVal);
}


void vcprojprocess::BSTR_to_CString(/*in*/BSTR bstr, /*out*/CString &s)
{
	s.Empty();

	_bstr_t bstrTag(bstr);

	UINT uLen = bstrTag.length();
	if (uLen==0) return;

	TCHAR *szTemp= new TCHAR[uLen+1];
	memset (szTemp, 0, uLen+1);

	LPOLESTR wszTag = bstrTag; // get ptr to Unicode

	int iBytes = ::WideCharToMultiByte(CP_ACP, 0,
			wszTag, uLen,
			szTemp, uLen, NULL, NULL);

	s = szTemp;

	delete [] szTemp;

	::SysFreeString(bstr);
}

CString vcprojprocess::TranslateConfigurationName(CString &sInputConfigName)
{
	CString s;
	s = m_szProjname + " - ";

	long i = sInputConfigName.Find(0,'|');
	if (i>-1)
	{
		CString sConfig = sInputConfigName.Left(i);
		CString sPlatform = sInputConfigName.ExcludeLeft(i+1);
		s += sPlatform + " " + sConfig;
	}
	else
		s += sInputConfigName;

	return s;
}

CString vcprojprocess::ExtractPlatform(CString &sInputConfigName)
{
	CString s;
	long i = sInputConfigName.Find(0,'|');
	if (i>-1)
		s= sInputConfigName.ExcludeLeft(i+1);

	return s;
}


void vcprojprocess::TokenizeString(/*in*/CString &szInput, char cToken, /*out*/ArrayCString &arrStrings)
{
	long i;

	CString s = szInput;

	arrStrings.RemoveAll();

	while ( (i=s.Find(0,cToken))>-1 )
	{
		arrStrings.Add( s.Left(i) );
		s = s.ExcludeLeft(i+1);
	}
	if (!s.IsEmpty())
		arrStrings.Add ( s );
}


void vcprojprocess::UntokenizeString(/*in*/ArrayCString &arrStrings, char cToken, /*out*/CString &szOutput)
{
	szOutput.Empty();

	for (long i=0;i<arrStrings.GetSize(); i++)
	{
		if (!szOutput.IsEmpty()) szOutput += cToken;

		szOutput += arrStrings.GetAt(i);
	}
}

void __stdcall _com_issue_error(HRESULT)
{
}

⌨️ 快捷键说明

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