![]() |
1
4
我认为你有两个主要的选择。
选项1需要修改宿主应用程序,但这将迫使宿主应用程序开发人员利用,选项2不需要对宿主应用程序进行任何更改,但不会具有同样的性能。 我个人并不想开始对引用计数进行胡乱的处理,假设主机应用程序正在卸载是有原因的,如果我是主机应用程序开发人员,那会让我很恼火。 |
![]() |
2
4
警告,肮脏的黑客: 你可以自己装东西。
每次召唤
因此,如果第一次加载DLL,您只需再次加载库,从而增加引用计数器。如果调用应用程序调用
编辑: 正如mghi指出的,如果进程终止,无论引用计数是否为零,都将卸载dll。 |
![]() |
3
2
另一个解决方案是,如果您有大量的全局数据要共享,那么创建一个Windows服务来“缓存”状态数据。您还需要实现一些跨进程边界工作的IPC,例如内存映射文件、邮箱、COM(本例中的单个实例)、TCP/IP等。您可能会发现,这种开销不仅仅是将状态写入一个文件,这就是为什么我只建议在状态数据量过大的情况下使用这种方法,或者对于每个进入您的DLL的请求只在整体的一部分中处理。 对于COM方法,除了请求(并保留)您将用于维护状态的COM对象的实例之外,服务不需要做太多的工作。因为它是一个单实例COM对象,所以所有请求都将指向同一个实例,从而允许您在请求之间保存状态。对对象的请求是序列化的,因此如果有多个客户端同时在同一台计算机上请求数据,这可能是性能问题。 |
![]() |
4
1
最好的方法是使用包含“globals”的类。实例化一个对象并将其作为dll函数的参数。但这对您没有帮助,因为您无法更改呼叫应用程序。 如果必须将全局数据保存在DLL中,解决方案是将它们写入文件。但这对性能有严重影响。 |
![]() |
5
0
如果我是你,我会把这些全局变量的值保存到一个文件中,当文件被释放时,动态链接库将被加载,当它被初始化时。所以我没有理由在磁盘上保存dll的内存转储。 |
![]() |
6
0
释放dll时将值写入注册表,加载dll时从注册表读取值。不要忘记在读取发现未设置密钥时提供默认值。 - Al。 |
![]() |
7
0
我同意先前关于全球国家信息具有危险性的评论,尽管我可以想象可能需要这样做。 我提出了一个更清晰版本的Dr's Dirty Hack,它没有像Skamradt的答案那样永久的缺点: 一个非常小的应用程序: 它没有任何外观,它不会显示在任务栏上。 任务1:加载DLL 任务2:获取它的命令行,运行它并等待它终止。 任务3:卸载DLL 任务4:退出。 安装程序: 它找到主应用程序的快捷方式并对其进行修改,使小应用程序运行,快捷方式指向的原始位置成为第一个参数。 结果:只有在主应用程序运行时,DLL才会保留在内存中,但不会在每次程序转储时卸载。 |
![]() |
8
0
这也可能有帮助
|
![]() |
Some1Else · 函数在Delphi中重新创建TForm 2 年前 |
![]() |
Agmcz · Delphi安卓库。so未安装(AAB) 2 年前 |
![]() |
nader · 如何使用delphi在web上提交表单 6 年前 |
![]() |
kwadratens · Delphi中的卡方分布函数代码 6 年前 |
|
user9672569 · 如何在完整的位图图像中绘制阴影效果? 6 年前 |
![]() |
mmmm · MSBuild(用于Delphi)Make-like功能 6 年前 |