2009-05-27 80 views
2

我已經成功升級了使用舊版Developer Studio編譯爲Visual Studio 2008的MFC應用程序。由於某些原因需要進行少量更改打破MFC的變化。現在,一切正常,我想要採取下一步並用/clr編譯解決方案。使用/ clr編譯MFC應用程序(步驟1:鏈接到動態DLL)

要做到這一點,我發現在MSDN網站上有用的信息:

這裏是我所採取的步驟:

  1. 運行時間庫設置爲多線程調試DLL(/ MDd)
  2. 設置使用MFC在共享DLL中使用MFC

但是,這樣做使我從項目鏈接:

  1. afxData參考不再能解決;以某種方式,afxData僅在與MFC靜態鏈接時纔可見。在我的代碼,我有以下聲明:

    extern AFX_DATA AUX_DATA afxData;

    與靜態鏈接MFC版本工作正常。

  2. _afxThreadState_afxWinState的引用也無法解析。

以下是完整的錯誤消息:

error LNK2001: unresolved external symbol "struct AUX_DATA afxData" ([email protected]@[email protected]@A) 
error LNK2001: unresolved external symbol "class CThreadLocal<class _AFX_THREAD_STATE> _afxThreadState" ([email protected]@[email protected][email protected]@@@A) 
error LNK2001: unresolved external symbol "class CProcessLocal<class _AFX_WIN_STATE> _afxWinState" ([email protected]@[email protected][email protected]@@@A) 

的情況下,這可能與該名稱重整...

那麼,我該怎麼才能做到動態鏈接反對MFC,但仍參考afxData,_afxThreadState_afxWinState

回答

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存在但未被記錄,可以在未來版本中進行更改。

Win state不響鈴,它是如何使用的?可能有一種新的方式來實現它。

+0

謝謝你的提示;這裏是我試圖解決這個問題的第一個結果:AfxGetThreadState()似乎取代了以前使用_afxThreadState。 我應該想到__declspec(dllimport)我自己!我試了一下,它的工作原理。 我會進一步調查_afxWinState的事情。它指向一個_AFX_WIN_STATE類,它有一個單獨的成員m_bUserAbort,在打印時我們的代碼使用該成員來檢查用戶是否按下了Cancel按鈕,我猜是從我看到的。 – 2009-05-27 14:51:13