VS2005, WTL проект, добавление ATL-ных классов
От: Юнусов Булат Россия  
Дата: 27.01.06 12:10
Оценка: 45 (4) +1
#Имя: FAQ.vs2005.addatl2wtl
ЮБ>Ругается — дескать только в 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;
    }
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.