【问题标题】:How Can I Add an "ATL Simple Object" to Old ATL DLL Project Upgraded to VS 2010?如何向升级到 VS 2010 的旧 ATL DLL 项目添加“ATL 简单对象”?
【发布时间】:2012-01-25 13:29:33
【问题描述】:

我们有一个 DLL 项目,它已经存在了很长时间(可能早在 Visual Studio 6),它已经针对每个新版本的 VS 进行了更新。该项目包含许多使用 ATL 实现的 COM 类。

升级到 VS 2010 后,项目仍然可以正常构建。但是,如果我尝试右键单击项目并选择 Add -> Class... -> ATL Simple Object,我会得到一个显示这样的错误框:

ATL 类只能添加到 MFC EXE 和 MFC 常规 DLL 项目或完全支持 ATL 的项目中。

这在 VS 2008 中有效。

当我查看项目属性时,Use of MFC 设置为 Use Standard Windows LibrariesUse of ATL 设置为 不使用 ATL。我将它们分别更改为 Use MFC in a Shared DLLDynamic Link to ATL,但仍然出现相同的错误。

我知道如何在不使用向导的情况下添加新的 ATL 对象,我可以尝试使用 VS 2010 从头开始​​重新创建项目以使其满意。但是有谁知道让 VS 允许我将 ATL 简单对象 向导与它不识别为“具有完全 ATL 支持”的项目的项目一起使用的简单方法吗?

【问题讨论】:

    标签: visual-studio visual-studio-2010 atl


    【解决方案1】:

    检查this thread out

    似乎在您的 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\VCWizards\1033\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;
                }
    

    【讨论】:

    • 后来我想,编辑function IsATLProject(oProj) { return true; } 更可靠,但它需要一个人去搜索那个向导脚本......而且第一个技巧就是使用项目源。跨度>
    • FWIW,我能够将所需的代码缩减为一行:“class CDummyModule: public CComModule {} DummyModule;”这也可以防止由于现有 _Module 定义而导致的任何错误。并确保在构建项目之前将其删除或注释掉,以防止由多个 CComModule 派生对象引起的问题。
    • 我认为有一些预定义的宏(cpp appwiz 的东西?)也可以用来将假代码隔离到仅 AppWziard 并将其从真正的二进制文件中排除。
    • 我今天刚刚在 VS2019 中使用了这个,效果很好。我将“假代码”包裹在#if false/#endif 中,所以我什至不需要担心添加/删除它以使用 ClassWizards。感谢分享@RomanR!
    【解决方案2】:

    同样的问题,但是项目源已经有 CComModule _Module; 修复它,基于 IsATLProject 脚本shown above,将其更改为 **ATL::**CComModule _Module;

    【讨论】:

      猜你喜欢
      • 2012-01-19
      • 2018-03-13
      • 2013-06-10
      • 2012-03-03
      • 2016-07-02
      • 2012-09-17
      • 2013-03-06
      • 2010-10-12
      • 2017-09-12
      相关资源
      最近更新 更多