确定我的程序实际使用哪些DLL和/或OCX文件?

确定我的程序实际使用哪些DLL和/或OCX文件?,dll,vb6,ocx,Dll,Vb6,Ocx,我的软件是用VB6编写的。出于诊断目的,我需要确定客户计算机上应用程序加载和使用的实际DLL/OCX文件 由于VB6 DLL(包括OCX文件)是COM库,因此它们是根据注册表中的信息间接加载的。这意味着使用的文件可能与开发/测试环境中使用的文件不同。有时在客户端环境中,这会导致故障,如果没有这些信息,很难诊断 (我的计划是在我的程序中构建一个诊断读出窗口,显示程序当时正在使用的库。)您可以使用查找程序所依赖的DLL 但是OCX并不容易找到,因为它们是在运行时根据应用程序依赖项和通过Windows

我的软件是用VB6编写的。出于诊断目的,我需要确定客户计算机上应用程序加载和使用的实际DLL/OCX文件

由于VB6 DLL(包括OCX文件)是COM库,因此它们是根据注册表中的信息间接加载的。这意味着使用的文件可能与开发/测试环境中使用的文件不同。有时在客户端环境中,这会导致故障,如果没有这些信息,很难诊断

(我的计划是在我的程序中构建一个诊断读出窗口,显示程序当时正在使用的库。)

您可以使用查找程序所依赖的DLL


但是OCX并不容易找到,因为它们是在运行时根据应用程序依赖项和通过Windows注册表注册的组件加载的。但是,您必须已经知道应用程序引用了哪些OCX组件—从工具>引用和所有您调用的
CreateObject

可以通过多种方式建立对DLL(或OCX文件)的运行时依赖关系。理想情况下,您需要考虑所有这些因素:

这个答案是VB6特有的,但许多其他编程语言也可以类似地工作


建立运行时依赖关系的机制:

传统动态链接库编译时的(非COM的DLL)

  • 文件(顾名思义)是根据编译结束时完成的链接过程在运行时动态加载的
  • 这包括使用如下语句的VB6代码:
    Declare Function…Lib…
  • (在.NET中,这意味着调用“本机代码”)
  • 识别:检查源代码
  • 在没有源的情况下进行识别:这些可以通过像Dependency Walker这样的工具进行检测
在编译COM DLL时

  • 在VB6中,这称为“早期绑定”
  • 这包括显式设置对DLL或OCX的引用的VB6代码
  • 请注意,依赖关系实际上在COM类或接口GUID上,而不是显式地在DLL文件本身上
  • 要识别:这些已在项目VBP中列出
  • 识别(替代):如果您没有VBP或源代码,这些依赖关系通常可以通过OLEView中的
    IMPORT
    语句显示。您可能需要从注册表中查找一些GUI,以查看实际使用的DLL文件
编译时静态链接库的(不是COM,不是DLL)

  • 库代码包含在正在编译的EXE或DLL中。因此,运行时不依赖于任何外部内容
  • 据我所知,这对于VB6程序是不可能的。类似于C链接器的东西可以使用这样的库。NET中的一个粗略等价物是使用ILMerge组合程序集
传统DLL(非COM)的运行时

  • DLL可以使用Win32 API(如
    LoadLibrary()
    )任意加载
  • 识别:您必须查看源代码以了解可能发生的情况
  • 或者,如果您没有源代码,您可以使用诸如Process Explorer和/或Process Monitor之类的工具来观察正在运行的实例,并查看实际加载了哪些DLL
COM DLL的运行时

  • 可以使用例如VB6
    CreateObject()
    调用任意加载类
  • 在VB6中,这称为“后期绑定”
  • 将使用哪个DLL提供类将由进程的激活上下文决定。激活上下文由应用程序清单文件(如果有)或Windows注册表(VB6程序的正常默认值)建立
  • 识别:您必须查看源代码以了解可能发生的情况。您还需要知道运行代码的PC上的配置状态是什么——假定未使用清单,将注册哪些DLL文件
  • 无源代码的替代方案:如上所述

重要提示:依赖项可以链接。因此,在建立所需内容的完整映射之前,您确实需要“遍历所有依赖项的链接”。在该映射的某个地方,您可以在需要部署的内容与操作系统或其他运行时环境可以提供的内容之间划一条界线。(对于VB6,这条线应该划得相当宽松)



你可能会认为所有这些都使任务变得非常困难或乏味——我完全同意。)

谢谢,我希望在VB6中从我的项目中执行此操作。我看到的自动执行此操作的唯一方法是通过收集VB项目中所有引用的脚本。如果使用普通文本编辑器查看项目文件,您将在文件的开头看到它们。但仅适用于COM控件,而不是使用其他DLL创建的控件。我很久以前就为我的vbdox做过这件事,比如这里的
Reference=*\G{7487DF5C-8A92-475C-A0ED-158467BF207A}#1.2#0#release\vbdoxcor.dll#vbdox Core
,我认为您全面理解依赖关系的意图是正确的。您可能还需要考虑为VB6应用程序创建一个应用程序清单,因为这将提供对运行时环境的快速控制,并消除在部署环境中注册的任意事物的许多或大部分依赖性。创建清单可能需要一些工作,但在复杂的客户支持环境中会得到成倍的回报。