代码之家  ›  专栏  ›  技术社区  ›  Mark Bertenshaw

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

  •  0
  • Mark Bertenshaw  · 技术社区  · 14 年前

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

    所有DLL都有一个 Mapping = Image ,以及指定的基址。不过,也有少数人有一个条目 Mapping = Data

    关于为什么有些DLL被作为映射文件加载,有什么建议吗?

    4 回复  |  直到 4 年前
        1
  •  1
  •   Hans Passant    14 年前

    这已经是很久以前的事了,但我确实记得visualbasic的本机执行模型是用P代码解释的。在VB4时代的某个地方,它开始支持编译本机代码。主要是为了与博兰的德尔福,IIRC保持竞争力。

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

        2
  •  0
  •   MarkJ    14 年前

    只是一个猜测,但是你的DLL有没有 Public Global 是否存储在数据区?

    更疯狂的猜测。你用的是XP吗?那些dll得到了什么 rebased 当EXE加载它们时(你可以 ask Process Explorer changing the base address . 它将使DLL加载更快,即使它不能解释小内存区域。

        3
  •  0
  •   Mike Spross Alex Martelli    14 年前

    .res VB6中的文件是显示两次的文件。

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

        4
  •  0
  •   Bob77    14 年前

    再加上一个猜测:

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

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

    系统将首先复制二进制文件 从网络到交换文件的图像 用于在上运行应用程序 网络。如果指定了CD,则 在可移动磁盘上的页面文件和 然后加载。