【发布时间】:2015-06-23 07:42:12
【问题描述】:
我们可以在 DLL_DETACH 中初始化 Win sock 吗?实际上我想在进程终止时发送一些数据(DLL_DETACH)
【问题讨论】:
-
提供你到目前为止所做的事情。并改进这个问题的标题和正文!这个问题不太好回答……
-
我认为这不太可能奏效。这肯定不可靠。
我们可以在 DLL_DETACH 中初始化 Win sock 吗?实际上我想在进程终止时发送一些数据(DLL_DETACH)
【问题讨论】:
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 主函数。
作为替代发送数据(包括初始化套接字引擎、创建连接和取消初始化套接字引擎的开销)可以在main (WinMain) 结束时实现。
【讨论】:
在 DllMain() 中调用 WSAStartup() 会由于加载程序锁而导致死锁。 WSAStartup() 会导致 DLL 被加载。
更好的解决方案是安装一个可以进行发送的服务。使用您首选的进程间通信方法(共享内存、命名管道等)从 DllMain() 与服务通信。
【讨论】: