【问题标题】:How to send a message through socket fron DLL on application closing?如何在应用程序关闭时通过 DLL 的套接字发送消息?
【发布时间】: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 会失败吗?

标签: c++ delphi sockets dll


【解决方案1】:

将初始化和最终确定 DLL 的函数添加到您的 DLL 中。使 DLL 的所有使用者都调用这些函数。在 finalize 函数中,你可以做任何你想做的事情。

正如您所发现的,将其留给 DllMain 并不好。你没有办法逃避它。 DllMain 是尝试套接字逗号的错误位置。

【讨论】:

  • 这样的功能是存在的,但是由于客户端应用程序超出了我们的控制范围,因此需要强制 DLL 发送该消息。这样做的另一个原因是准确地重现已弃用版本的界面和行为。
  • 嗯,要么这样,要么DllMain
  • 另一种选择可能是每次收到DLL_THREAD_ATTACH 通知时递增计数器,然后每次收到DLL_THREAD_DETACH 通知时递减计数器。当计数器在最后一个 DLL_THREAD_DETACH 上降至 0 时,请执行您需要的任何清理操作。 DLL 尚未从进程中分离出来。
猜你喜欢
  • 1970-01-01
  • 2019-03-31
  • 1970-01-01
  • 1970-01-01
  • 2014-12-20
  • 1970-01-01
  • 1970-01-01
  • 2012-09-28
  • 2017-08-05
相关资源
最近更新 更多