我们可以在DLL_DETACH中初始化Win sock吗? actulay我想在进程终止时发送一些数据(DLL_DETACH)
答案 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主函数。
作为替代方法,可以在main
(WinMain
)结束时实现发送数据(包括初始化套接字引擎,创建连接和取消初始化套接字引擎的开销)。< / p>
答案 1 :(得分:0)
在DllMain()中调用WSAStartup()将导致由于加载程序锁定而导致的死锁。 WSAStartup()可能导致加载DLL。
更好的解决方案是安装可以进行发送的服务。使用您首选的进程间通信方法(共享内存,命名管道等)与DllMain()中的服务进行通信。