boost :: asio :: io_service выдает исключение - PullRequest
2 голосов
/ 12 января 2011

Хорошо, я серьезно не могу понять это.

У меня есть проект 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: подсказка

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

1 Ответ

1 голос
/ 12 января 2011

Microsoft рекомендует не звонить WSAStartup из DllMain, поэтому лучше всего было бы создать поток ввода-вывода в другом месте.

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

...