使用 /clr 编译 MFC 应用程序(步骤 1:链接到动态 DLL)
Posted
技术标签:
【中文标题】使用 /clr 编译 MFC 应用程序(步骤 1:链接到动态 DLL)【英文标题】:Compiling MFC application with /clr (step1: linking against dynamic DLLs) 【发布时间】:2009-05-27 07:46:15 【问题描述】:我已成功将使用旧版 Developer Studio 编译的 MFC 应用程序升级到 Visual Studio 2008。由于 MFC 中存在一些重大更改,因此需要进行少量更改。现在一切正常,我想采取下一步并使用/clr
编译解决方案。
为此,我在 MSDN 网站上找到了有用的信息:
How to: Migrate to /clr How to: Compile MFC and ATL Code with /clr以下是我采取的步骤:
-
将运行时库设置为多线程调试DLL (/MDd)。
将使用 MFC 设置为 在共享 DLL 中使用 MFC。
但是,这样做会阻止我链接项目:
无法再解析对afxData
的引用;不知何故,afxData
只有在静态链接到 MFC 时才可见。在我的代码中,我有以下声明:
extern AFX_DATA AUX_DATA afxData;
与静态链接的 MFC 版本配合得很好。
对_afxThreadState
和_afxWinState
的引用也无法解析。
以下是完整的错误消息:
error LNK2001: unresolved external symbol "struct AUX_DATA afxData" (?afxData@@3UAUX_DATA@@A)
error LNK2001: unresolved external symbol "class CThreadLocal<class _AFX_THREAD_STATE> _afxThreadState" (?_afxThreadState@@3V?$CThreadLocal@V_AFX_THREAD_STATE@@@@A)
error LNK2001: unresolved external symbol "class CProcessLocal<class _AFX_WIN_STATE> _afxWinState" (?_afxWinState@@3V?$CProcessLocal@V_AFX_WIN_STATE@@@@A)
如果这可能与名称修改有关...
那么,我该怎么做才能动态链接到 MFC,但仍然引用 afxData
、_afxThreadState
和 _afxWinState
?
【问题讨论】:
【参考方案1】:在共享 DLL 中使用 MFC 时,AUX_DATA 必须为 dllimport
ed。
extern __declspec(dllimport) AUX_DATA afxData
对于线程状态,不要使用模板类,而是使用其中之一
AFX_MODULE_THREAD_STATE* pState = _AFX_CMDTARGET_GETSTATE()->m_thread;
AFX_THREAD_STATE* pState = AfxGetThreadState();
取决于您需要的状态信息。例如,请参阅here 了解某些已移至模块状态以修复错误的成员。请注意,AfxGetModuleThreadState 存在但未记录在案,可能会在未来的版本中更改。
Win状态不响铃,如何使用?可能有一种新方法可以实现它。
【讨论】:
感谢您的提示;这是我尝试解决这个问题的第一个结果:AfxGetThreadState() 似乎取代了以前使用的 _afxThreadState。我自己应该想到 __declspec(dllimport) !我试过了,它有效。我将进一步调查 _afxWinState 的事情。它指向一个 _AFX_WIN_STATE 类,它有一个成员 m_bUserAbort,我们的代码在打印时使用它来检查用户是否按下了取消,我猜从我所看到的。 afxWinState.m_bUserAbort 是微软犯的一个设计错误,根据我阅读这篇文章的理解:ddj.com/184409908?pgno=5 解决方案是通过在我们自己的代码中使用全局标志来完全替换该代码,并通过重写默认的 AbortProc。 添加了一些说明。在某些情况下,您可能需要模块线程状态。以上是关于使用 /clr 编译 MFC 应用程序(步骤 1:链接到动态 DLL)的主要内容,如果未能解决你的问题,请参考以下文章
如何在 MFC No CLR 中访问 Winform ActiveX 控件