Как добавить "простой объект ATL" в старый проект ATL DLL, обновленный до VS 2010?

У нас есть проект DLL, который существует в течение длительного времени (возможно, еще до Visual Studio 6), который был обновлен для каждой новой версии VS. Проект содержит ряд COM-классов, реализованных с использованием ATL.

после обновления до VS 2010, проект по-прежнему строит нормально. Однако, если я попытаюсь щелкнуть правой кнопкой мыши проект и выбрать добавить ->класса... ->простой объект ATL, Я получаю сообщение об ошибке, в котором говорится следующее:

классы ATL могут быть добавлены только в MFC EXE и MFC регулярные проекты DLL или проекты с полной поддержкой ATL.

Это сработало в VS 2008.

когда я смотрю на свойства проекта,использование MFC был установлен до Использовать Стандартные Библиотеки Windows и использование ATL был установлен до не использовать ATL. Я изменил их на использовать MFC в общей DLL и динамическая ссылка на ATL соответственно, но все равно получите ту же ошибку.

Я знаю, как добавлять новые объекты ATL без использования мастера, и я мог бы попытаться воссоздать проект с нуля, используя VS 2010, чтобы сделать его счастливым. Но кто-нибудь знает какой-либо простой способ получить VS, чтобы позволить мне использовать ATL простой объект мастер с проектом, который он не распознает как проект "с полной поддержкой ATL"?

2 ответов


Регистрация этот поток из.

кажется, что добавление этого фрагмента информации ваш код ATL c++ заставит его работать. Вам не нужно фактически создавать проект, просто удалите этот материал после того, как вы закончите с мастером (при условии, что решение работает для вас).

// Added fake code begins here

class CAppModule : 
    public CComModule
{
};

// Added fake code ends here, below is regular ATL project stuff

CAppModule _Module;

вот откуда все это берется, в $(VisualStudio)\VC\VCWizards33\common.js:

/******************************************************************************
Description: Returns a boolean indicating whether project is ATL-based.
oProj: Project object
******************************************************************************/
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 == "ATL::CComModule" || strTypeString == "ATL::CAutoThreadModule")
            {
                return true;
            }

та же проблема здесь, но у источника проекта уже был CComModule _Module; Исправлено на основе сценария IsATLProject показано выше, изменив его на **ATL::**CComModule _Module;