boost :: asio :: io_service抛出异常

时间:2011-01-12 11:35:34

标签: c++ boost-asio wsastartup

好的,我真的无法弄清楚这一点。

我在MSVC中有一个试图使用Asio的DLL项目(来自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):

  

网络子系统不可用。如果Windows套接字实现无法正常运行,则WSAStartup会返回此错误,因为它用于提供网络服务的基础系统当前不可用。用户应检查:相应的Windows套接字DLL文件是否在当前路径中。他们并没有尝试同时使用多个Windows套接字实现。如果系统上有多个Winsock DLL,请确保路径中的第一个适用于当前加载的网络子系统。 Windows套接字实现文档,以确保当前正确安装和配置所有必需的组件。

然而,这似乎都不适用于我(或者我认为)。

这是我的命令行:

  

/ 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 个答案:

答案 0 :(得分:1)

Microsoft建议使用not to call WSAStartup from DllMain,因此最好的办法是在其他位置创建IO线程。

  

WSAStartup函数通常会导致加载特定于协议的帮助程序DLL。因此,不应从应用程序DLL中的DllMain函数调用WSAStartup函数。