【问题标题】:Can a CWinApp be placed in a DLL?可以将 CWinApp 放在 DLL 中吗?
【发布时间】:2010-05-28 20:49:51
【问题描述】:

我正在将一些旧版应用程序更新到 Visual Studio 10 并处于链接器地狱。所有这些 DLL 都从 CWinApp 派生类,并使用 AfxGetApp() 来访问对象。当我链接 DLL 时,我得到了看起来像全局静态对象的未解析外部对象,这些对象会被普通应用程序的 main() 拉入:

Shell.lib(SHELL.obj) : error LNK2001: unresolved external symbol "public: static struct CRuntimeClass const CException::classCException" (?classCException@CException@@2UCRuntimeClass@@B)
Shell.lib(SHELL.obj) : error LNK2001: unresolved external symbol "public: static struct CRuntimeClass const CFrameWnd::classCFrameWnd" (?classCFrameWnd@CFrameWnd@@2UCRuntimeClass@@B)
Shell.lib(SHELL.obj) : error LNK2001: unresolved external symbol "public: static class CRect const CFrameWnd::rectDefault" (?rectDefault@CFrameWnd@@2VCRect@@B)

我当前忽略默认库和附加库的组合(您可以轻松地通过谷歌找到链接器地狱的答案的方法)是:msvcprtd.lib,mfc100d.lib,mfcs100d.lib,libcmtd.lib

当我添加 nafxcwd.lib(mfc 库)时,这三个外部符号会解析,但我最终会得到一堆其他重复的符号(需要使用 /FORCE:MULTIPLE),最后 ___argc 和 ___argv 变得无法解析。

所以基本问题是:你能在 VS10 中链接一个包含 CWinApp 的 DLL 吗?你如何设置链接器来做到这一点?

【问题讨论】:

  • 链接器抱怨的定义与 CWinApp 无关。 (例如,CException 在 DLL 中可以正常工作。)所以虽然我不知道您的问题是什么,但事实并非如此。
  • 您是否有常规的 MFC DLL 项目或导出类的扩展 DLL?
  • 该类未导出。这是一个 MFC DLL。它不是 MFC 应用程序。代码没有创建或修改任何窗口。它是 20 年前写的,今天人们承认他们不知道自己在做什么。这就是为什么我的问题是“您可以将应用程序类放入 DLL 中吗?”类本身只能从 DLL 中访问(使用 AfxGetApp() 和大量转换)。基本上,它被用作我们跟踪库的钩子,并作为将所有全局数据存储在单例类中的一种方式。我想要做的是摆脱 MFC 的东西,但我不想让它链接

标签: c++ visual-studio-2010 mfc winapi legacy


【解决方案1】:

你能在 VS10 中链接一个包含 CWinApp 的 DLL 吗?

当我在 Visual Studio 10 中创建一个新项目并使用 MFC DLL 模板时,我发现模板代码本身包含一个从 CWinApp 派生的类。当然模板编译和链接都很好,所以这个问题的答案是肯定的。

我搜索了链接器抱怨的那些对象的定义,并在 Visual Studio 的包含目录中的 afx.h 和 afxwin.h 中找到了它们,它们与 Visual Studio 中包含的其余 ATL 和 MFC 代码打包在一起安装时使用 Studio。

您是否偶然使用了速成版? Visual Studio 2010 Express Edition 和 Pro Edition 之间的少数区别之一是 ATL 和 MFC 应用程序不会在 Express Edition 中编译。您必须使用专业版。

【讨论】:

    猜你喜欢
    • 2011-04-12
    • 2011-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-29
    • 1970-01-01
    • 2018-12-16
    • 1970-01-01
    相关资源
    最近更新 更多