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

时间:2017-11-15 09:10:58

标签: dll vb6 ocx

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

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

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

2 个答案:

答案 0 :(得分:1)

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

但OCX并不那么容易找到,因为它们是在运行时基于应用程序依赖性和通过Windows注册表注册的组件加载的。但您必须已经知道应用程序引用了哪些OCX组件 - 来自工具>参考以及您致电CreateObject的所有地点。

答案 1 :(得分:1)

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

此答案特定于VB6,但许多其他编程语言也可以类似地工作。


建立运行时依赖性的机制:

在编译时,对于传统的动态链接库(不是COM的DLL)

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

在编译COM DLL时

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

在静态链接库的编译时(不是COM,不是DLL)

  • 库代码包含在正在编译的EXE或DLL中。因此,没有任何外部依赖于运行时。
  • 据我所知,这对于VB6程序是不可能的。诸如C链接器之类的东西可以使用这样的库。 .NET中的大致等效项将是使用ILMerge组合程序集。

在运行时使用传统DLL(不是COM)

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

在运行时获取COM DLL

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

重要提示:依赖关系可以相互链接。因此,实际上,您需要“遍历所有依赖项的链接”,直到建立所需内容的完整映射。在该映射中的某个位置,您可以在需要部署的内容与可以依靠其提供的操作系统或其他运行时环境之间划清界限。 (对于VB6,IMO应该相当宽泛地划出界线。)


您可能会认为所有这些使任务非常困难或乏味-我完全同意。 :)