我们可以在 DLL DETACH 中初始化 Winsock 吗?实际上我想在进程终止时发送一些数据(DLL DETACH)
Posted
技术标签:
【中文标题】我们可以在 DLL DETACH 中初始化 Winsock 吗?实际上我想在进程终止时发送一些数据(DLL DETACH)【英文标题】:Can We initilize Winsock in DLL_DETACH ? actulay i want to send some data when a process get terminated(DLL_DETACH) 【发布时间】:2015-06-23 07:42:12 【问题描述】:我们可以在 DLL_DETACH 中初始化 Win sock 吗?实际上我想在进程终止时发送一些数据(DLL_DETACH)
【问题讨论】:
提供你到目前为止所做的事情。并改进这个问题的标题和正文!这个问题不太好回答…… 我认为这不太可能奏效。这肯定不可靠。 【参考方案1】: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
) 结束时实现。
【讨论】:
【参考方案2】:在 DllMain() 中调用 WSAStartup() 会由于加载程序锁而导致死锁。 WSAStartup() 会导致 DLL 被加载。
更好的解决方案是安装一个可以进行发送的服务。使用您首选的进程间通信方法(共享内存、命名管道等)从 DllMain() 与服务通信。
【讨论】:
以上是关于我们可以在 DLL DETACH 中初始化 Winsock 吗?实际上我想在进程终止时发送一些数据(DLL DETACH)的主要内容,如果未能解决你的问题,请参考以下文章
使用 Detours 挂钩 Api 在 Detach 上崩溃
Win7运行软件"损坏的图像"dll没有被指定在Windows上运行怎么办