Compilación de aplicación MFC con / clr (paso 1: vincular contra DLL dinámicos)
Pregunta
He actualizado con éxito una aplicación MFC que fue compilado con una versión antigua de Developer Studio para Visual Studio 2008. A se necesita muy pequeño número de cambios debido a algunos cambios de ruptura en MFC. Ahora que todo funciona, me gustaría dar el siguiente paso y compilar la solución con /clr
.
Para ello, he encontrado información útil en el sitio web de MSDN:
Estos son los pasos que he dado:
- Ajuste el Tiempo de ejecución Biblioteca Multi-roscado de depuración DLL (/ MDD) .
- Ajuste el Uso de MFC Utilizar MFC en un archivo DLL compartido .
Sin embargo, esto no me permite vincular el proyecto:
-
La referencia a
afxData
ya no puede ser resuelto; De alguna manera,afxData
sólo es visible cuando enlazado dinámico con MFC. En mi código, tengo la siguiente declaración:extern AFX_DATA AUX_DATA afxData;
que funciona muy bien con la versión de MFC enlazado estáticamente.
-
Las referencias a
_afxThreadState
y_afxWinState
no se pueden resolver tampoco.
Estos son los mensajes de error 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)
En el caso de que esto podría estar relacionado con el nombre mangling ...
Así que, ¿qué puedo hacer para enlazar dinámicamente con MFC, pero aún refiero afxData
, _afxThreadState
y _afxWinState
?
Solución
Al utilizar MFC en una DLL compartida, AUX_DATA debe dllimport
ed.
extern __declspec(dllimport) AUX_DATA afxData
En estado hilo, en lugar de utilizar clases de plantilla, utilice uno de estos
AFX_MODULE_THREAD_STATE* pState = _AFX_CMDTARGET_GETSTATE()->m_thread;
AFX_THREAD_STATE* pState = AfxGetThreadState();
En función de la información de estado que requiera. Por ejemplo, véase aquí para algunos miembros que fueron trasladados al módulo de estado para corregir un error. Tenga en cuenta que AfxGetModuleThreadState existe pero no está documentado y se podría cambiar en una versión futura.
Estado de victorias no suena una campana, cómo se utiliza? Es probable que haya una nueva forma de lograrlo.