Компиляция приложения MFC с / clr (шаг 1: связывание с динамическими библиотеками DLL) - PullRequest
2 голосов
/ 27 мая 2009

Я успешно обновил приложение MFC, которое было скомпилировано со старой версией Developer Studio, до Visual Studio 2008. Потребовалось очень небольшое количество изменений из-за серьезных изменений в MFC. Теперь, когда все работает, я хотел бы сделать следующий шаг и скомпилировать решение с помощью /clr.

Для этого я нашел полезную информацию на веб-сайте MSDN:

Вот шаги, которые я предпринял:

  1. Установите Runtime Library на Многопоточная отладочная DLL (/MDd).
  2. Установите Использование MFC на Использование MFC в общей библиотеке DLL .

Однако из-за этого я не могу связать проект:

  1. Ссылка на afxData больше не может быть разрешена; каким-то образом afxData виден только при статической привязке к MFC. В моем коде у меня есть следующее объявление:

    extern AFX_DATA AUX_DATA afxData;

    , которая прекрасно работает со статически связанной версией MFC.

  2. Ссылки на _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 Ответ

2 голосов
/ 27 мая 2009

При использовании MFC в совместно используемой DLL значение 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(); 

В зависимости от требуемой информации о состоянии. Например, см. здесь для некоторых членов, которые были переведены в состояние модуля для исправления ошибки. Обратите внимание, что AfxGetModuleThreadState существует, но не имеет документов и может быть изменен в будущей версии.

Состояние Win не звонит в колокол, как оно используется? Вероятно, есть новый способ сделать это.

...