【问题标题】:Can We initilize Winsock in DLL_DETACH ? actulay i want to send some data when a process get terminated(DLL_DETACH)我们可以在 DLL DETACH 中初始化 Winsock 吗?实际上我想在进程终止时发送一些数据(DLL DETACH)
【发布时间】:2015-06-23 07:42:12
【问题描述】:

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

【问题讨论】:

  • 提供你到目前为止所做的事情。并改进这个问题的标题和正文!这个问题不太好回答……
  • 我认为这不太可能奏效。这肯定不可靠。

标签: dll winsock


【解决方案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() 与服务通信。

    【讨论】:

      猜你喜欢
      • 2017-09-22
      • 2011-05-20
      • 2020-10-11
      • 2011-01-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多