我正忙着编写一个 dll,为主机应用程序提供多种功能。该应用程序动态调用 dll,在每次函数调用后加载和释放它。

我无法控制主机应用程序。我只能在 dll 内使用。有没有办法可以将某些变量保留在内存中,以便我可以在每个函数中重用它们?显然,当主机应用程序卸载 dll 时,全局变量会被清除。将 dll 保存到文件听起来很混乱!

谁能建议一种分配可以保持全局的变量的方法?

谢谢

有帮助吗?

解决方案

我认为你在这里有两个主要选择。

  1. 提供你的函数的两个版本,你现在拥有的一个,加上另一个版本,它们传递一个缓冲区(记录,无论什么),你可以从中读取以前的状态,当然也可以将状态更新到其中。将此称为该函数的高性能版本。他们会想使用它。

  2. 将状态保存在某个文件中,就像将 cookie(基本上就是这样)一样。

选项 1 需要对主机应用程序进行修改,但对于主机应用程序开发人员来说很有吸引力,选项 2 不需要对主机应用程序进行任何更改,但性能不高。

我个人不会倾向于开始处理引用计数,大概主机应用程序正在卸载是有原因的,如果我是主机应用程序开发人员,那会让我烦恼。

其他提示

警告,肮脏的黑客:

您可以加载自己。

LoadLibrary每个呼叫递增基准计数器,FreeLibrary递减它。只有当计数器达到零,DLL被卸载。

所以,如果你的DLL被加载在第一时间,你又把您的书架,从而增加引用计数器。如果调用应用程序调用FreeLibrary引用计数器被递减,但DLL没有得到卸载。

修改:如图mghi指出的那样,该DLL将被如果该过程终止,卸载的引用计数是否是零或不

如果您有大量全局数据要共享,另一种解决方案是创建一个 Windows 服务来“缓存”状态数据。您还需要实现某种跨进程边界工作的 IPC,例如内存映射文件、邮箱、COM(本例中为单个实例)、TCP/IP 等。您可能会发现这种开销不仅仅是将状态写入文件,这就是为什么我只在状态数据量过多时才推荐这种方法,或者只会为每个请求处理部分数据到你的dll中。

对于 COM 方法,服务除了请求(并保留)您将用来维护状态的 com 对象的实例之外,不需要做太多事情。由于它是单个实例 com 对象,因此所有请求都将发送到同一个实例,从而允许您在请求之间保存状态。对对象的请求是序列化的,因此如果您有多个客户端同时在同一台计算机上请求数据,这可能会导致性能问题。

,最好的方法是使用含有所述“全局”的一类。您实例化一个对象,并把它作为参数传递给DLL函数。但是,这不会帮助你,因为你不能改变调用的应用程序。

如果你必须保持全局数据在DLL中,一个解决方案是将它们写入文件。不过这次的性能造成严重影响。

如果我是你,我会的全局变量的值保存到一个文件时,该dll被释放,当它被初始化加载它们。我所以没有理由保存DLL的存储器转储在磁盘上。

写的值,以当DLL被释放注册表,并在装入DLL时从注册表中读取的值。不要忘记,当读发现的主要未被设定为提供一个默认的。

-Al。

我同意对全球状态信息是很危险的先前的评论,但我可以想像它可能是必要的。

我提出DR的肮脏的黑客更清洁的版本不具有作为永久像skamradt的回答下行:

一个非常小的应用程式:

它没有任何外观,它可保持其自身从显示在任务栏上。

任务#1:加载DLL

任务#2:取它的命令行,运行它,并等待它终止

任务#3:卸载DLL

任务#4:退出

在安装程序:

它找到快捷方式(多个)到主应用程序,并修改它们所以小应用程序运行时,原始位置的快捷指向变成第一参数。

结果:仅DLL,只要保持在存储器中作为主要的应用程序正在运行,但它不会卸载每次程序转储它时间

这也可能是有帮助

option 1: 创建握着你的页面文件支持的变量共享内存区 - 如果你能打开共享内存区,你的DLL以前加载(假设“私人”共享内存的名字,也许名字类似process_id_yourdllname) - 如果你能“T打开它,然后你创建和初始化它的第一次。如果你创建它,那么你就不用费心删除它 - 但如果你打开它,你会关闭它 - 卸载时。我相信,当应用程序关闭,因为没有任何其他应用程序应该有手柄,以这种特殊的“私人”共享内存区的区域将被释放。

option 2: 创建存在只是为管理您的全局变量的目的,第二个.dll文件。你的DLL中的一个可以载入DLL B,而不是释放它,无论你需要管理的全局变量DLL b。将。它应该消失,当应用程序消失,我不认为你可能需要关心的参与(因为你不会卸载DLL B)的(可能没用)引用计数。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top