【问题标题】:How to add Classes that use MFC to an ATL project?如何将使用 MFC 的类添加到 ATL 项目?
【发布时间】:2013-03-06 13:21:51
【问题描述】:

我正在编写一个 .NET 分析器(一个 DLL)并且我正在使用 ATL。我想在我的项目中添加一些使用 MFC 的类,但是我遇到了很多错误,但是这些类在 MFC 项目中运行良好。我尝试更改项目属性并设置Use of MFC = Use MFC in a shared DLL 但它不起作用,我还尝试包括“afx.h”...

这是我得到的一些错误:

Error   214 error C2373: 'CString' : redefinition; different type modifiers iaparameters.cpp    31

Error   206 error C2653: 'CIAParameters' : is not a class or namespace name iaparameters.cpp    30

任何帮助将不胜感激。

【问题讨论】:

  • 您使用的是哪个 ATL/MFC 版本?使用 VS2010/2012,您应该能够将 MFC 支持添加到您的 ATL 项目(右键单击项目,添加,新项目,MFC 支持)。此外,CString 的重新定义对我来说似乎是版本不匹配,因为自 ATL 8 以来 CString 是 ATL 和 MFC 的共享类。

标签: c++ dll mfc atl


【解决方案1】:

对于this question,这应该是可能的。但根据我自己的经验,这样做有点棘手。您必须手动包含您正在使用的版本的 MFC 标头。您也可以自定义 CWinApp 类以启用 MFC 类工厂(this is 默认 MFC 支持会为您生成。this 也可能会有所帮助)。

您还应该注意,在 ATL 8 中,最重要的 MFC 和 ATL 类现在是 shared between both libraries

如果这不起作用,最简单的方法是重新创建项目,检查 MFC 支持 选项并重新导入您的代码。这就是我最终这样做的方式。

最后但同样重要的是,您还应该注意ATL Internals 指出您应该只在真正需要时才使用 MFC。如今,几乎所有强大的 MFC 助手也是 ATL 的一部分。这是书中的一段话。前两个原因对 ATL 来说是一个很大的优势,最后一个更像是一个笑话:

  1. 我不能没有CString(或CMapCList 等等) 在 C++ 标准委员会定义标准库之前,MFC 实用程序类是作为权宜之计而构建的。他们已经做到了,所以我们可以停止使用 MFC 版本。标准库中提供的stringmaplist 等类比它们的 MFC 等效类更灵活、更健壮。此外,CString 现在是 MFC 和 ATL 之间的共享类,因此可以在 ATL 项目中使用,而无需包含 MFC 的其余部分并链接到 MFC 库。其他 MFC 实用程序类也已共享,包括 CPointCRect。对于喜欢 MFC 集合类的用户,ATL 现在包括 MFC 样式集合(CAtlMapCAtlList 等)。
  2. 没有向导我活不下去。 [...] ATL 向导可以说与 MFC 提供的一样广泛。
  3. 我已经了解 MFC,但我无法学习任何新东西。 [...]

ATL 为 STL 容器和类型提供了良好的支持。您应该考虑使用它们,而不是引用 MFC。

【讨论】:

    猜你喜欢
    • 2016-07-02
    • 2011-02-08
    • 2012-01-19
    • 2012-09-05
    • 2011-04-25
    • 2011-01-30
    • 2011-02-11
    • 2012-04-04
    • 2012-01-25
    相关资源
    最近更新 更多