使用/clr编译MFC应用程序(步骤1:链接动态DLL)

使用/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只有在针

我已成功地将使用旧版本的Developer Studio编译的MFC应用程序升级到Visual Studio 2008。由于MFC中出现了一些突破性的更改,因此需要进行非常少量的更改。现在一切正常,我想采取下一步,用
/clr
编译解决方案

为此,我在MSDN网站上找到了有用的信息:

以下是我采取的步骤:

  • 将运行库设置为多线程调试DLL(/MDd)
  • 将MFC的使用设置为在共享DLL中使用MFC
  • 但是,这样做会阻止我链接项目:

  • 无法再解析对
    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来完全替换该代码。添加了一些说明。在某些情况下,您可能需要模块线程状态。