【发布时间】:2013-09-24 07:23:16
【问题描述】:
我有一个用 C++ 编写的 DLL,供我们的客户(第三方开发人员在他们的应用程序中使用)使用。 DLL 中有一些设施可以通过winsock 连接到我们公司的服务器,并通过特定协议与服务器进行通信。
未完成的任务是在应用程序关闭时向活动服务器发送一种告别消息。但是了解我所知道的事件(应用程序关闭)的唯一方法是 DllMain/DLL_PROCESS_DETACH 案例。我知道不建议这样做,我阅读了 Raymond Chen's article 关于此和 MSDN 文档的信息,但我需要一个解决方案而不是警告。
当然,我尝试过从 DllMain 发送消息,但似乎此时 winsock 库已经被分离,因为我收到的是 WSANOTINITIALISED (10093) 错误。
我还尝试创建一个静态终结器,如下所示:
struct Finalization
{
~Finalization() {
// sending the message
}
};
static Finalization f;
也没有成功。
我觉得我需要的有点像要知道的触发点,即进程何时终止。同时使用该库的情况可以忽略,因为它的具体意义完全没有意义。
我正在考虑的是该库与一个接口头捆绑在一起,它将包含在客户的应用程序中。我可以利用这个事实在文件中放置一些东西,一个互斥体或类似的东西。
也许值得一提的是,该库的先前版本是用 Delphi 编写的,并且分离消息是从一个完成部分发送的,它运行良好,也许只是偶然。
提前感谢您的想法。
【问题讨论】:
-
难道你不能从 dll 中导出像
sendFarewell()或类似的函数,并在它即将关闭时从你的应用程序中调用这个函数吗? -
@Krister Andersson。是的,这样的功能确实存在。并且在文档中明确说明了在退出之前调用它。并且服务器在断开连接时正确地完成了会话(但有超时)。但这是在退出时发送该消息的要求,至少因为旧 dll 这样做了,而新 dll 将承担相同的逻辑。
-
让我更清楚。如果您能够调用 WSAGetLastError,则不会分离 winsock。
-
@Sertac Akyuz。任务不是避免错误,而是发送消息。
-
@Silver - 我不知道怎样才能更清楚。 Winsock 没有分离/卸载或任何东西,因为您成功调用 WSAGetLastError。您可能遇到与从 dll 分离的进程无关的错误。为什么没有启动winsock?进程分离时调用 WSAStartup 会失败吗?