Compilare l'applicazione MFC con / clr (step1: collegando contro DLL dinamici)
Domanda
ho aggiornato con successo un'applicazione MFC che è stato compilato con una vecchia versione di Developer Studio per Visual Studio 2008. Un fosse bisogno molto piccolo numero di cambiamenti a causa di alcuni cambiamenti di rottura in MFC. Ora che tutto funziona, mi piacerebbe fare il passo successivo e compilare la soluzione con /clr
.
Per fare ciò, ho trovato informazioni utili sul sito Web MSDN:
Questi sono i passi che ho preso:
- Imposta Runtime Library a Multi-threaded Debug DLL (/ MDD) .
- Imposta Utilizzo di MFC a Usa MFC in una DLL condivisa .
Tuttavia, così facendo mi impedisce di collegare il progetto:
-
Il riferimento alle
afxData
non può più essere risolto; in qualche modo,afxData
è visibile solo quando si collega staticamente contro MFC. Nel mio codice, ho la seguente dichiarazione:extern AFX_DATA AUX_DATA afxData;
che funziona bene con la versione MFC collegata in modo statico.
-
I riferimenti al
_afxThreadState
e_afxWinState
non possono essere risolti sia.
Qui ci sono i messaggi di errore completo:
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)
nel caso in cui questo potrebbe essere correlato al nome storpiatura ...
Quindi, cosa posso fare per collegare in modo dinamico contro MFC, ma ancora riferisco afxData
, _afxThreadState
e _afxWinState
?
Soluzione
Quando si utilizza MFC in una DLL condivisa, AUX_DATA deve essere dllimport
ed.
extern __declspec(dllimport) AUX_DATA afxData
Per stato del thread, invece di usare le classi template, utilizzare uno di questi
AFX_MODULE_THREAD_STATE* pState = _AFX_CMDTARGET_GETSTATE()->m_thread;
AFX_THREAD_STATE* pState = AfxGetThreadState();
A seconda delle informazioni di stato desiderato. Ad esempio, vedere qui per alcuni membri che sono stati spostati al modulo dello stato per correggere un bug. Si noti che AfxGetModuleThreadState esiste ma è senza documenti e potrebbe essere modificato in una versione futura.
Stato di Win non squilla un campanello, come si usa? C'è probabilmente un nuovo modo per realizzarlo.