2011-01-12 3 views
2

Хорошо, я серьезно не могу понять это.boost :: asio :: io_service исключает исключение

У меня есть проект DLL в MSVC, который пытается использовать Asio (от Boost 1.45.0), но всякий раз, когда я создаю свой io_service, генерируется исключение. Вот то, что я делаю для испытательных целей:

void run() 
{ 
    boost::this_thread::sleep(boost::posix_time::seconds(5)); 
    try 
    { 
     boost::asio::io_service io_service; 
    } 
    catch (std::exception & e) 
    { 
     MessageBox(NULL, e.what(), "Exception", MB_OK); 
    } 
} 

BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) 
{ 
    if (fdwReason == DLL_PROCESS_ATTACH) 
    { 
     boost::thread thread(run); 
    } 
    return TRUE; 
} 

Это то, что окно сообщения показывает:

Winsock: WSAStartup не может функционировать в это время, так как основная система использует для предоставления сетевых услуг является в настоящее время недоступен

Вот что говорит об этом MSDN (код ошибки 10091, WSASYSNOTREADY):

Сетевая подсистема недоступна. Эта ошибка возвращается WSAStartup, если реализация Windows Sockets не может функционировать, поскольку базовая система, используемая для предоставления сетевых услуг, в настоящее время недоступна. Пользователи должны проверить: что соответствующий DLL-файл Windows Sockets находится в текущем пути. То, что они не пытаются одновременно использовать несколько приложений Windows Sockets. Если в вашей системе имеется более одной DLL Winsock, убедитесь, что первый в пути подходит для загруженной сетевой подсистемы. Документация по внедрению Windows Sockets, чтобы убедиться, что все необходимые компоненты установлены и настроены правильно.

Однако все это не относится ко мне (или, как я полагаю).

Вот моя командная строка:

/O2/GL/D "_WIN32_WINNT = 0x0501"/D "_WINDLL"/FD/EHsc/MD/Gy/Fo "Release \"/Fd "Release \ vc90.pdb "/ W3/WX/nologo/c/TP/errorReport: prompt

Если кто знает, что может быть неправильным, пожалуйста, помогите мне! Благодарю.

ответ

1

Корпорация Майкрософт рекомендует not to call WSAStartup from DllMain, поэтому лучше всего создать нить IO в другом месте.

Функция WSAStartup обычно приводит к загрузке DLL-хелперов, специфичных для протокола. В результате функция WSAStartup не должна вызываться из функции DllMain в DLL приложения.

+0

Где еще может быть создана нить? Это единственная точка входа, правильно? – DSB

+0

Что случилось с созданием любого потока (IO или нет) в DllMain? какая разница между IO и другими потоками в этой области? –

+0

Ну, я, наконец, исправил это, просто поместив io_service за пределы этой конкретной DLL. Независимо от того, что вы предложили, действительно проблема, это действительно привело меня к решению, поэтому спасибо. – DSB