在DLLMAIN中
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
{
WSADATA st_wsaData = {'\0'};
WSAStartup(MAKEWORD(2,2),&st_wsaData);
}
break;
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
{
WSACleanup();
}
break;
}第二次调用socket函数后返回错误提示说没有初始化。。 被封装成 DLL 应用层调用就出这个问题 为什么?

解决方案 »

  1.   

    第二次调用前 DLL被Free了
    这个初始化一定要放在DLL里吗?在主函数里调用就行了吧。
      

  2.   

    The WSAStartup function typically leads to protocol-specific helper DLLs being loaded. As a result, the WSAStartup function should not be called from the DllMain function in a application DLL. This can potentially cause deadlocks. For more information, please see the DLL Main Function.这句话你看一下。
    WSAStartup内部调用了LoadLibrary之类的函数。所以不能放在DllMain里。
      

  3.   

    你在DLL里导出两个函数。一个init里面WSAStartup。另一个uninit时面WSAClose。让用户手工调一下吧。MSN上都说不让放在DllMain里用了。也没啥办法。