我们可以在 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)的主要内容,如果未能解决你的问题,请参考以下文章

DLL_PROCESS_DETACH 未调用 C++

使用 Detours 挂钩 Api 在 Detach 上崩溃

电脑丢失dll文件怎么恢复

Win7运行软件"损坏的图像"dll没有被指定在Windows上运行怎么办

❥关于C++之多线程┆<thread>join()detach()

如何本地化 win32(非 MFC)DLL