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

问题描述 投票:0回答:4

我的一位同事在试图弄清我们的VB6 / C#2.0应用程序的内存使用时,注意到少数VB6 DLL在SysInternals Process Explorer应用程序中有两个条目。

所有DLL都有一个Mapping = Image的条目和一个指定的基地址。但是,也有一些具有Mapping = Data的条目,其基址为零,并且内存使用量小得多。我似乎还记得有关使用映射的内存文件在进程之间共享内存的一些事情,但是我们绝对没有做那么有趣的事情。 EXE之间的所有通信都是通过COM完成的,据我所知,没有人编写过共享内存组件。

关于为何将某些DLL作为映射文件加载的任何建议?

c# dll vb6
4个回答
1
投票

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

P代码将作为数据加载,并且比机器代码紧凑得多。而且慢得多。机器代码将像Windows中的任何DLL一样加载,内存映射文件页面会将代码错误插入内存。


0
投票

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

更疯狂的猜测。您是否使用XP,并且EXE加载它们时这些DLL获得rebased吗? (您可以ask Process Explorer用另一种颜色突出显示重新建立基础的DLL)。您可以通过changing the base address防止重新基准化。即使它不能解释较小的内存区域,也可以使DLL加载更快。


0
投票

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

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


0
投票

添加另一个疯狂的猜测:

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.