Компиляция приложения MFC с /clr (шаг 1: связывание с динамическими библиотеками DLL)
Я успешно обновил приложение MFC, которое было скомпилировано со старой версией Developer Studio, до Visual Studio 2008. Потребовалось очень небольшое количество изменений из-за серьезных изменений в MFC. Теперь, когда все работает, я хотел бы сделать следующий шаг и скомпилировать решение с /clr
,
Для этого я нашел полезную информацию на веб-сайте MSDN:
Вот шаги, которые я предпринял:
- Установите для библиотеки времени выполнения значение Многопоточная отладочная DLL (/ MDd).
- Настройте использование MFC на использование MFC в общей библиотеке DLL.
Однако из-за этого я не могу связать проект:
Ссылка на
afxData
больше не может быть решена; как-то,afxData
виден только при статической привязке к MFC. В моем коде у меня есть следующее объявление:extern AFX_DATA AUX_DATA afxData;
которая отлично работает со статически связанной версией MFC.
Ссылки на
_afxThreadState
а также_afxWinState
не может быть решена либо.
Вот полные сообщения об ошибках:
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 ответ
При использовании MFC в общей DLL, AUX_DATA должен быть dllimport
редактор
extern __declspec(dllimport) AUX_DATA afxData
Для состояния потока вместо использования шаблонных классов используйте один из этих
AFX_MODULE_THREAD_STATE* pState = _AFX_CMDTARGET_GETSTATE()->m_thread;
AFX_THREAD_STATE* pState = AfxGetThreadState();
В зависимости от состояния информация вам требуется. Например, смотрите здесь для некоторых членов, которые были перемещены в состояние модуля, чтобы исправить ошибку. Обратите внимание, что AfxGetModuleThreadState существует, но не имеет документов и может быть изменен в будущей версии.
Состояние Win не звонит в колокол, как оно используется? Вероятно, есть новый способ сделать это.