От: | Юнусов Булат | ||
Дата: | 27.01.06 12:10 | ||
Оценка: | 45 (4) +1 | ||
#Имя: | FAQ.vs2005.addatl2wtl |
ЮБ>Воркараунды которые разруливали эту ситуацию в vs1998 и vs2003 не спасли.ATL classes can only be added to MFC EXE and MFC Regular DLL projects or projects with full ATL support.
function IsATLProject(oProj)
{
try
{
var oCM = oProj.CodeModel;
oCM.Synchronize();
// look for global variable derived from CAtlModuleT
var oVariables = oCM.Variables;
for (var nCntr = 1; nCntr <= oVariables.Count; nCntr++)
{
var oVariable = oVariables(nCntr);
var strTypeString = oVariable.TypeString;
if (strTypeString == "WTL::CServerAppModule")
return true;
if (strTypeString == "ATL::CComModule" || strTypeString == "ATL::CAutoThreadModule")
{
return true;
}
var oClass = oCM.Classes.Find(strTypeString)
if (oClass)
{
if (oClass.IsDerivedFrom("CAtlDllModuleT") || oClass.IsDerivedFrom("ATL::CAtlDllModuleT") ||
oClass.IsDerivedFrom("CAtlModuleT") || oClass.IsDerivedFrom("ATL::CAtlModuleT"))
{
return true;
}
}
// TODO: This block of code fails for unknown reason, the block above is known to work.
// were we not hitting this case before?
//var oType = oVariable.Type;
//var oCodeType = oType.CodeType;
//if (oCodeType && oCodeType.IsDerivedFrom("ATL::CAtlModuleT"))
//{
// return true;
//}
}
// check for [module] attribute
if (oCM.Attributes.Find("module"))
{
return true;
}
if (!oProj.Object.Files("resource.h"))
{
return false;
}
// check for a module attribute applied to a class
var oClasses = oCM.Classes;
for (var nCntr = 1; nCntr <= oClasses.Count; nCntr++)
{
var oClass = oClasses(nCntr);
if (oClass.Attributes.Find("module"))
{
return true;
}
}
return false;
}
catch(e)
{
throw e;
}
}