📄 vcprojprocess.cpp
字号:
// 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 + -