2

我有一个用 C++ 编写的 DLL,供我们的客户使用——第三方开发人员在他们的应用程序中使用。DLL 中有一些设施可以通过winsock 连接到我们公司的服务器,并通过特定协议与服务器进行通信。

悬而未决的任务是在应用程序关闭时向活动服务器发送一种告别消息。但了解我所知道的事件(应用程序关闭)的唯一方法是 DllMain/DLL_PROCESS_DETACH 案例。我知道不建议这样做,我阅读了Raymond Chen 的关于此和 MSDN 文档的文章,但我需要一个解决方案而不是警告。

当然,我尝试从 DllMain 发送消息,但似乎那时 winsock 库已经分离,因为我收到的是 WSANOTINITIALISED (10093) 错误。

我还尝试创建一个静态终结器,如下所示:

struct Finalization
{
    ~Finalization() {
        // sending the message
    }
};

static Finalization f;

也没有成功。

我觉得我需要的有点像一个触发点,知道进程何时终止。可以忽略同时使用该库的情况,因为它的具体内容绝对没有任何意义。

我正在考虑的是该库与一个接口标头捆绑在一起,它将包含在客户的应用程序中。我可以利用这个事实在文件中放置一些东西,一个互斥锁或类似的东西。

也许值得一提的是,该库的先前版本是用 Delphi 编写的,并且分离消息是从一个完成部分发送的,并且它工作得很好,也许只是偶然。

提前感谢您的想法。

4

1 回答 1

0

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

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

于 2013-09-24T07:28:18.060 回答