VS2005, WTL проект, добавление ATL-ных классов
От: Юнусов Булат Россия  
Дата: 28.12.05 20:00
Оценка:
Ругается — дескать только в mfc прожекты с поддержкой атль она может это дело добавлять.
Воркараунды которые разруливали эту ситуацию в vs1998 и vs2003 не спасли.
Может кто то уже разобрался, что надо подкрутить?
Re: VS2005, WTL проект, добавление ATL-ных классов
От: Odi$$ey Россия http://malgarr.blogspot.com/
Дата: 29.12.05 04:20
Оценка:
Здравствуйте, Юнусов Булат, Вы писали:

ЮБ>Ругается — дескать только в mfc прожекты с поддержкой атль она может это дело добавлять.

ЮБ>Воркараунды которые разруливали эту ситуацию в vs1998 и vs2003 не спасли.
ЮБ>Может кто то уже разобрался, что надо подкрутить?

помогает что-нить поредактировать в stdafx.h, перекомпилировать проект и попробовать добавить ATL class еще раз

p/s/ WTL проект должен быть "Create as COM server", чтобы был idl
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[2]: VS2005, WTL проект, добавление ATL-ных классов
От: Юнусов Булат Россия  
Дата: 29.12.05 08:52
Оценка:
Здравствуйте, Odi$$ey, Вы писали:

OE>помогает что-нить поредактировать в stdafx.h, перекомпилировать проект и попробовать добавить ATL class еще раз

Не прокатывает

OE>p/s/ WTL проект должен быть "Create as COM server", чтобы был idl

Так и есть.
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;
    }
}
Re[2]: VS2005, WTL проект, добавление ATL-ных классов
От: _nn_  
Дата: 27.01.06 12:34
Оценка:
Здравствуйте, Юнусов Булат, Вы писали:

А если проект не создат как COM Server как побороть ?
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[3]: VS2005, WTL проект, добавление ATL-ных классов
От: Юнусов Булат Россия  
Дата: 27.01.06 13:05
Оценка:
Здравствуйте, _nn_, Вы писали:

__>А если проект не создат как COM Server как побороть ?


Самый правильный способ — создать новый прожект с таким же именем сравнить и перенести в старый разницу
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.