Я использую MFC класса CSocket. Ничего сложного - откройте соединение с сервером и отправьте короткое сообщение. Код отлично работает, когда я связываюсь с MFC в DLL. Однако при вызове CSocket::Create() происходит сбой, когда я подключаюсь к MFC в статической библиотеке.
Я хотел бы использовать MFC в статической библиотеке, так как это упрощает распространение.





Получаете ли вы вообще какие-либо предупреждения компоновщика? Убедитесь, что вы подключаете правильную библиотеку CRT в зависимости от настройки «Генерация кода». Для многопоточной статики вам понадобится libcmt.lib для выпуска (libcmtd.lib для отладки), также убедитесь, что _AFXDLL не определен.
Согласно 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 - еще кто-нибудь?