将 C++ ATL 可执行应用程序从 VS2003 迁移到 VS2013

Posted

技术标签:

【中文标题】将 C++ ATL 可执行应用程序从 VS2003 迁移到 VS2013【英文标题】:Migrating C++ ATL Executable application from VS2003 to VS2013 【发布时间】:2015-08-10 13:40:00 【问题描述】:

我正在将我的 C++ ATL 可执行应用程序从 VS2003 迁移到 VS2013。

在 VS 2003 中

CExeModule 类:公共 CComModule

在VS2013中(改为)

CExeModule 类:公共 ATL::CAtlExeModuleT

我已成功迁移项目,在编译过程中我遇到了问题

**

错误 C2664: 'ATL::CHandle::CHandle(HANDLE) throw()' : 无法转换 参数 1 从 'bool' 到 'ATL::CHandle &'

**

如果我评论以下代码,我不会收到此错误

_AtlModule.WinMain(nShowCmd);

有人可以帮忙解决这个错误吗?

附加信息

C:\Program Files\Microsoft Visual Studio 12.0\VC\atlmfc\include\atlbase.h(3628):错误 C2664:'ATL::CHandle::CHandle(HANDLE) throw()':无法转换参数 1 从 'bool' 到 'ATL::CHandle &' C:\Program Files\Microsoft Visual Studio 12.0\VC\atlmfc\include\atlbase.h(3608):编译类时 模板成员函数'HRESULT ATL::CAtlExeModuleT::PreMessageLoop(int) throw()' C:\Program Files\Microsoft Visual Studio 12.0\VC\atlmfc\include\atlbase.h(3695) :参见对函数模板实例化的参考 'HRESULT ATL::CAtlExeModuleT::PreMessageLoop(int) throw()' 存在 编译

stdafx.h(107) : 参见类模板实例化的参考 'ATL::CAtlExeModuleT' 正在编译

【问题讨论】:

我想问题出在你没有显示的CExeModule::PreMessageLoop 上。 我的代码中没有任何 PreMessageLoop...这就是我感到惊讶的地方... 其他东西会干扰(一些头文件包含在 stdafx.h 或其他地方等)。您可以在 VS2013 中创建一个干净的 ATL EXE 项目以确保它可以构建,并且众所周知它是可构建的。 WinMain 的行包括此类中的一系列调用,这些调用最终会发生冲突。我不认为这条线本身不好(看起来不错)。 是的,我通过在 VS2013 中创建一个新的 ATL 项目来尝试相同的方法,发现它构建良好(没有添加任何新代码)。并且该行没有错“_AtlModule.WinMain(nShowCmd);” 它窒息的那一行是CHandle h(pT->StartMonitor()); CExeModule 有一个方法StartMonitor 返回bool,有没有机会?另一种可能性 - 你可能有一个宏或 typedef 在你的程序某处重新定义HANDLE?还要检查项目属性中的预处理器定义。 【参考方案1】:

感谢伊戈尔 Tandetnik....

我在更改 CExeModule 类中的函数名后解决了这个问题 bool StratMonitor()

【讨论】:

以上是关于将 C++ ATL 可执行应用程序从 VS2003 迁移到 VS2013的主要内容,如果未能解决你的问题,请参考以下文章

从 VS2012 在 C++ 中使用 ATL 创建 COM

将托管 C++ 从 vs2003 移植到 vs2008 的问题

创建可执行 COM 作为 ATL 项目并在 C# 中使用它

如何在 VS C++ 中使用 .tlb 类型创建接口方法?

C零基础课程-01-从C程序到可执行文件的过程

C++基于ATL工程编写ActiveX控件步骤