2

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

我在 MSVC 中有一个 DLL 项目,它试图使用 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):

网络子系统不可用。如果 Windows Sockets 实现由于其用于提供网络服务的底层系统当前不可用而无法运行,则 WSAStartup 将返回此错误。用户应检查: 适当的 Windows Sockets DLL 文件是否在当前路径中。他们没有尝试同时使用多个 Windows Sockets 实现。如果您的系统上有多个 Winsock DLL,请确保路径中的第一个适用于当前加载的网络子系统。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 /错误报告:提示

如果有人知道可能出了什么问题,请帮助我!谢谢。

4

1 回答 1

1

Microsoft 建议不要调用WSAStartupfromDllMain,因此最好的办法是在其他地方创建一个 IO 线程。

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

于 2011-01-12T12:22:05.040 回答