将 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的主要内容,如果未能解决你的问题,请参考以下文章