ЮБ>Ругается — дескать только в mfc прожекты с поддержкой атль она может это дело добавлять.
ATL classes can only be added to MFC EXE and MFC Regular DLL projects or projects with full ATL support.
ЮБ>Воркараунды которые разруливали эту ситуацию в vs1998 и vs2003 не спасли.
ЮБ>Может кто то уже разобрался, что надо подкрутить?
В общем, как забороть это дело:
Лезем туда где лежат студийные визардовые скрипты
Дефолтно оно тут: C:\Program Files\Microsoft Visual Studio 8\VC\VCWizards\1033
Нам нужен файлик common.js
Открываем его и ищем функцию с сигнатурой function IsATLProject(oProj)
Устроено оно достаточно прозрачно: анализируются глобальные переменные объявленные в прожекте: имена типов, порождены ли они от ATL::CAtlModuleT, и не помечен ли кто нибудь аттрибутом [module].
Но почему то эта кухня не разруливает наследование WTL::CServerAppModule : WTL::CAppModule : ATL::CComModule : ATL::CAtlModuleT<CComModule>
(может потому что неймспейсы меняются)
Добавил тыгенда еще одну проверку и оно (о чудо) заработало
На самом деле наверно можно более правильно проверять
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;
}
}
|