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

时间:2009-05-27 07:46:15

标签: mfc clr linker afx

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

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

以下是我采取的步骤:

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

    1. 无法再解析对afxData的引用;不知何故,afxData仅在静态链接到MFC时可见。在我的代码中,我有以下声明:

      extern AFX_DATA AUX_DATA afxData;

      适用于静态链接的MFC版本。

    2. 无法解析对_afxThreadState_afxWinState的引用。

    3. 以下是完整的错误消息:

      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 个答案:

答案 0 :(得分:2)

在共享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存在但未记录,可以在将来的版本中更改。

胜利状态不响铃,它是如何使用的?可能有一种新方法可以实现它。