【问题标题】:MFC CSocket in a static library静态库中的 MFC CSocket
【发布时间】:2014-01-07 11:20:39
【问题描述】:

我正在使用 MFC 类 CSocket。没什么复杂的——打开到服务器的连接并发送一条短消息。当我在 DLL 中与 MFC 链接时,代码工作正常。但是,当我链接到静态库中的 MFC 时,对 CSocket::Create() 的调用会崩溃。

我想在静态库中使用 MFC,因为它可以简化分发。

【问题讨论】:

    标签: c++ mfc


    【解决方案1】:

    根据http://support.microsoft.com/kb/193101

    需要为每个线程创建套接字使用的句柄映射。以下代码显示了执行此操作的函数:

       void SocketThreadInit()
       {
       #ifndef _AFXDLL
       #define _AFX_SOCK_THREAD_STATE AFX_MODULE_THREAD_STATE
       #define _afxSockThreadState AfxGetModuleThreadState()
    
          _AFX_SOCK_THREAD_STATE* pState = _afxSockThreadState;
          if (pState->m_pmapSocketHandle == NULL)
             pState->m_pmapSocketHandle = new CMapPtrToPtr;
          if (pState->m_pmapDeadSockets == NULL)
             pState->m_pmapDeadSockets = new CMapPtrToPtr;
          if (pState->m_plistSocketNotifications == NULL)
             pState->m_plistSocketNotifications = new CPtrList;
    
       #endif
       }
    

    【讨论】:

    • 你为什么要讨论线程?据我记得(那是 4 年前!)该程序是单线程的。当然,我没有在我的问题中提到线程。无论如何,我不再使用 MFC - 还有人吗?
    【解决方案2】:

    您是否收到任何链接器警告?确保根据“代码生成”设置链接正确的 CRT 库。对于多线程静态,您需要 libcmt.lib 用于发布(libcmtd.lib 用于调试),同时确保未定义 _AFXDLL。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-06
      • 1970-01-01
      相关资源
      最近更新 更多