我无法控制宿主应用程序,只能在 DLL 内部工作。有没有办法将某些变量保存在内存中,以便我可以在每个函数中重复使用它们?显然,全局变量在宿主应用程序卸载 DLL 时会被清除。将 DLL 保存到文件中听起来非常混乱!
有人能建议一种分配全局变量的方法吗?
谢谢
警告,这是一个不太正规的方法:
你可以自己加载。
每次调用LoadLibrary
都会增加一个引用计数器,FreeLibrary
会将其减少。只有当计数器达到零时,DLL才会被卸载。
因此,如果第一次加载您的DLL时,您只需重新加载您的库,从而增加引用计数器。如果调用应用程序调用FreeLibrary
,则引用计数器会减少,但DLL不会被卸载。
编辑:正如mghi所指出的那样,无论引用计数是否为零,进程终止时都会卸载DLL。
提供两个版本的功能。一个是你现在拥有的版本,另一个是他们可以传递一个缓冲区(记录、等等),你可以从中读取以前的状态,并当然更新状态。将其称为函数的高性能版本。他们会想使用它。
像保存 cookie 一样(基本上就是这样),将状态保存在某个文件中。
最好的方法是使用一个包含“全局变量”的类。您实例化一个对象并将其作为参数传递给dll函数。但这对您没有帮助,因为您无法更改调用应用程序。
如果您必须将全局数据保留在dll中,则解决方案是将它们写入文件。但这会严重影响性能。
这也可能会有所帮助
选项1:
创建一个由分页文件支持的保存变量的共享内存区域 - 如果您能够打开该共享内存区域,则您的dll先前已加载(假设“私有”共享内存名称,可能命名为process_id_yourdllname) - 如果无法打开它,则首次创建并初始化它。如果您创建它,则不必删除它 - 但是如果您打开它,则在卸载时应将其关闭。我相信该区域将在应用程序关闭时释放,因为没有其他应用程序应该具有对此特定的“私有”共享内存区域的句柄。
选项2:
创建第二个.dll,仅用于管理全局变量。 您的dll A可以加载该dll B,并且不释放它,在dll B中放置任何您需要管理全局变量的内容。当应用程序消失时,它应该消失,而且我认为您可能不需要关心涉及的(可能无用的)引用计数(因为您不会卸载dll B)。
如果我是你,我会在释放 dll 文件时将这些全局变量的值保存到文件 a 中,在初始化时再加载它们。我认为没有必要将 dll 的内存转储保存到磁盘上。
我同意先前评论中关于全局状态信息的危险之处,但我想象它可能是必要的。
我提出了DR的不太干净的hack的更清洁版本,它没有像skamradt的答案那样永久的缺点:
一个非常小的应用程序:
它没有任何外观,它避免在任务栏上显示。
任务#1:加载DLL
任务#2:获取它的命令行,运行它并等待其终止。
任务#3:卸载DLL
任务#4:退出。
安装程序:
它找到主应用程序的快捷方式并修改它们,使小应用程序运行,原始位置指向的快捷方式成为第一个参数。
结果:只要主应用程序正在运行,DLL就会保留在内存中,但每次程序将其转储时都不会被卸载。