Compilación de aplicación MFC con / clr (paso 1: vincular contra DLL dinámicos)

StackOverflow https://stackoverflow.com/questions/914448

  •  06-09-2019
  •  | 
  •  

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:

  1. Ajuste el Tiempo de ejecución Biblioteca Multi-roscado de depuración DLL (/ MDD) .
  2. Ajuste el Uso de MFC Utilizar MFC en un archivo DLL compartido .

Sin embargo, esto no me permite vincular el proyecto:

  1. 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.

  2. 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?

¿Fue útil?

Solución

Al utilizar MFC en una DLL compartida, AUX_DATA debe dllimported.

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top