为什么一些VB6 DLL作为映射文件加载?

时间:2010-04-23 09:08:24

标签: c# dll vb6

我的一位同事在试图弄清楚VB6 / C#2.0应用程序的内存使用时发现,少数VB6 DLL在SysInternals Process Explorer应用程序中有两个条目。所有DLL都有一个Mapping = Image条目和一个指定的基址。但是,少数还有一个Mapping = Data条目,基地址为零,内存使用量要小得多。我似乎记得使用映射内存文件在进程之间共享内存的东西,但我们绝对不会做这样有趣的事情。 EXE之间的所有通信都是通过COM完成的,据我所知,没有人编写共享内存组件。

这不是绝望,但我会对任何关于为什么某些DLL作为映射文件加载的建议非常感兴趣

谢谢,

Mark Bertenshaw

4 个答案:

答案 0 :(得分:1)

这是很久以前的事了,但我确实记得Visual Basic的原生执行模型是解释的P代码。在VB4时代的某个地方,它开始支持编译本机机器代码。主要是为了保持与Borland的Delphi,IIRC的竞争力。

P代码将作为数据加载,并且比机器代码更紧凑。而且慢得多。机器代码将像Windows中的任何DLL一样加载,内存映射文件页面 - 将代码故障存储在内存中。

答案 1 :(得分:0)

只是猜测,但是你的任何DLL都有在BAS模块中声明的PublicGlobal个变量吗?如果是这样,它们在DLL中的所有对象之间共享,并且可能存储在数据区域中?

更疯狂的猜测。你在使用XP并且那些在EXE加载时得到rebased的DLL吗? (您可以ask Process Explorer突出显示另一种颜色的重新命名的DLL)。您可以changing the base address阻止变基。即使它没有解释小内存区域,它也会使DLL加载更快。

答案 2 :(得分:0)

内存映射的DLL是否是嵌入了资源的DLL?我不确定Windows(或VB6,就此问题)通常如何处理DLL中的资源,但我想知道在VB6中使用.res文件显式编译的DLL是否显示出来两次。

也许这样做是为了当两个EXE加载相同的DLL时,它们可以共享DLL资源的单个副本。我完全猜测了。

答案 3 :(得分:0)

添加另一个猜测:

是否有可能使用/ SWAPRUN设置链接其中一些PE文件?

  

/ SWAPRUN选项告诉   操作系统首先复制   链接器输出到交换文件,然后   从那里运行图像。这是一个   Windows NT 4.0(及更高版本)功能。

     

如果指定了NET,则进行操作   系统将首先复制二进制文件   从网络到交换文件的图像   并从那里加载它。这个选项是   用于运行应用程序   网络。指定CD时,   操作系统将复制图像   在可移动磁盘上到页面文件和   然后加载它。