Compilação de aplicação MFC com / clr (passo 1: ligando contra DLLs dinâmicas)

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

  •  06-09-2019
  •  | 
  •  

Pergunta

Eu tenho atualizado com êxito um aplicativo MFC que foi compilado com uma versão antiga do Developer Studio para Visual Studio 2008. Um número muito pequeno de mudanças eram necessárias devido a algumas alterações significativas em MFC. Agora que tudo funciona, eu gostaria de dar o próximo passo e compilar a solução com /clr.

Para fazer a informação útil assim, eu encontrei no site da MSDN:

Aqui estão os passos que tomei:

  1. Defina o Runtime Library para Multi-threaded Debug DLL (/ MDD) .
  2. Defina o Uso de MFC para Usar MFC em uma DLL compartilhada .

No entanto, isso me impede de vincular o projeto:

  1. A referência a afxData já não pode ser resolvido; de alguma forma, afxData só é visível quando a vinculação estaticamente contra MFC. No meu código, eu tenho a seguinte declaração:

    extern AFX_DATA AUX_DATA afxData;

    que funciona bem com a versão estaticamente ligada MFC.

  2. As referências a _afxThreadState e _afxWinState não pode ser resolvido também.

Aqui estão as mensagens de erro completa:

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)

no caso de isto pode estar relacionado com o nome mangling ...

Então, o que posso fazer, a fim de vincular dinamicamente contra MFC, mas ainda afxData referência, _afxThreadState e _afxWinState?

Foi útil?

Solução

Ao usar MFC em uma DLL compartilhada, AUX_DATA deve ser dllimported.

extern __declspec(dllimport) AUX_DATA afxData

Para o estado da linha, em vez de usar classes de modelo, use um destes

AFX_MODULE_THREAD_STATE* pState = _AFX_CMDTARGET_GETSTATE()->m_thread;
AFX_THREAD_STATE* pState = AfxGetThreadState(); 

Dependendo das informações do estado que necessita. Por exemplo, veja aqui para alguns membros que foram transferidos para estado do módulo para corrigir um bug. Note-se que AfxGetModuleThreadState existe, mas é não documentado e pode ser alterado em uma versão futura.

Win Estado não tocar um sino, como ele é usado? Há provavelmente uma nova maneira de realizá-lo.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top