我们可以在DLL_DETACH中初始化Winsock吗? actulay我想在进程终止时发送一些数据(DLL_DETACH)

时间:2015-06-23 07:42:12

标签: dll winsock

我们可以在DLL_DETACH中初始化Win sock吗? actulay我想在进程终止时发送一些数据(DLL_DETACH)

2 个答案:

答案 0 :(得分:0)

DLL_DETACH实际上是DLL_PROCESS_DETACH

有可能(我不认为有任何机制可以阻止它),但不建议这样做。 WSAStartup位于ws2_32.dll。这是来自DllMain official doc的片段(备注部分):

  

调用需要除Kernel32.dll之外的DLL的函数可能会导致难以诊断的问题。例如,调用User,Shell和COM函数可能会导致访问冲突错误,因为某些函数会加载其他系统组件。相反,在终止期间调用这些函数会导致访问冲突错误,因为相应的组件可能已经被卸载或未初始化。

此外,来自WSAStartup official doc(相同备注部分):

  

WSAStartup函数通常会导致加载特定于协议的帮助程序DLL。 因此,不应从应用程序DLL中的DllMain函数调用WSAStartup函数。这可能会导致死锁。有关更多信息,请参阅DLL主函数。

作为替代方法,可以在mainWinMain)结束时实现发送数据(包括初始化套接字引擎,创建连接和取消初始化套接字引擎的开销)。< / p>

答案 1 :(得分:0)

在DllMain()中调用WSAStartup()将导致由于加载程序锁定而导致的死锁。 WSAStartup()可能导致加载DLL。

更好的解决方案是安装可以进行发送的服务。使用您首选的进程间通信方法(共享内存,命名管道等)与DllMain()中的服务进行通信。