Компиляция приложения MFC с помощью /clr (шаг 1:связывание с динамическими DLL)

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

  •  06-09-2019
  •  | 
  •  

Вопрос

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

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

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

  1. Установить Библиотека времени исполнения к Многопоточная отладочная DLL (/MDd).
  2. Установить Использование МФЦ к Используйте 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?

Это было полезно?

Решение

При использовании 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 существует, но не документирован и может быть изменен в будущей версии.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top