好的,我真的无法弄清楚这一点。
我在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:提示
如果有人知道可能出现的问题,请帮帮我!感谢。
答案 0 :(得分:1)
Microsoft建议使用not to call WSAStartup
from DllMain
,因此最好的办法是在其他位置创建IO线程。
WSAStartup函数通常会导致加载特定于协议的帮助程序DLL。因此,不应从应用程序DLL中的DllMain函数调用WSAStartup函数。