使用/clr编译MFC应用程序(步骤1:链接动态DLL)
我已成功地将使用旧版本的Developer Studio编译的MFC应用程序升级到Visual Studio 2008。由于MFC中出现了一些突破性的更改,因此需要进行非常少量的更改。现在一切正常,我想采取下一步,用使用/clr编译MFC应用程序(步骤1:链接动态DLL),mfc,clr,linker,afx,Mfc,Clr,Linker,Afx,我已成功地将使用旧版本的Developer Studio编译的MFC应用程序升级到Visual Studio 2008。由于MFC中出现了一些突破性的更改,因此需要进行非常少量的更改。现在一切正常,我想采取下一步,用/clr编译解决方案 为此,我在MSDN网站上找到了有用的信息: 以下是我采取的步骤: 将运行库设置为多线程调试DLL(/MDd) 将MFC的使用设置为在共享DLL中使用MFC 但是,这样做会阻止我链接项目: 无法再解析对afxData的引用;不知何故,afxData只有在针
/clr
编译解决方案
为此,我在MSDN网站上找到了有用的信息:
afxData
的引用;不知何故,afxData
只有在针对MFC进行静态链接时才可见。在我的代码中,我有以下声明:
extern-AFX\u-DATA-AUX\u-DATA-afxData代码>
它与静态链接的MFC版本配合使用
\u afxThreadState
和\u 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)
错误LNK2001:未解析的外部符号“struct AUX_DATA afxData”(?afxData@@3UAUX_DATA@@A)
错误LNK2001:未解析的外部符号“类CThreadLocal\u afxThreadState”(?\u afxThreadState@@3V$CThreadLocal@V_AFX_THREAD_STATE@@@@(A)
错误LNK2001:未解析的外部符号“类CProcessLocal\u afxWinState”(?\u afxWinState@@3V$CProcessLocal@V_AFX_WIN_STATE@@@@(A)
如果这可能与名称mangling有关
那么,为了动态链接MFC,但仍然引用
afxData
、\u afxThreadState
和\u afxWinState
,我该怎么做?在共享DLL中使用MFC时,辅助数据必须是dllimport
ed
extern __declspec(dllimport) AUX_DATA afxData
对于线程状态,不要使用模板类,而是使用以下其中之一
AFX_MODULE_THREAD_STATE* pState = _AFX_CMDTARGET_GETSTATE()->m_thread;
AFX_THREAD_STATE* pState = AfxGetThreadState();
取决于所需的状态信息。例如,请参阅,了解一些已移动到模块状态以修复错误的成员。请注意,AfxGetModuleThreadState存在,但未记录,可以在将来的版本中更改
Win state没有敲响警钟,它是如何使用的?可能有一种新的方法来完成它。谢谢你的提示;下面是我尝试解决这个问题的第一个结果:AfxGetThreadState()似乎取代了以前使用的_afxThreadState。我本应该自己想到declspec(dllimport)的!我试过了,效果很好。我会进一步调查这件事的。它指向一个_AFX_WIN_STATE类,该类只有一个成员m_bUserAbort,我们的代码在打印时使用它来检查用户是否按下了Cancel键,据我所见。afxWinState.m_bUserAbort是微软的一个设计错误,从我阅读本文的理解来看:解决方案是在我们自己的代码中使用全局标志并重写默认的AbortProc来完全替换该代码。添加了一些说明。在某些情况下,您可能需要模块线程状态。