1

如何以编程方式确定给定的原生 VB6 生成的 DLL/OCX 依赖于哪些类型库(GUID 和版本)?

背景:当打开一个项目时,其中一个引用的类型库无法加载其依赖项之一时,VB6 IDE 会阻塞,但它并不能说明无法满足哪个依赖项——甚至哪个引用具有无法满足的依赖。这是我公司经常发生的事情,所以我试图补充 VB6 IDE 的故障排除信息。

相关细节/尝试:

  • 确实有VB源代码。这告诉我回购中特定修订版的 GUID 和版本,但是在分析 DLL/OCX/TLB 文件时,我不知道回购的哪个版本(如果有的话——可能来自分支或可能永远不会有已提交到分支)给定的 DLL/OCX 对应。
  • 我试过使用tlbinf32.dll,但它似乎无法列出导入。
  • 我对 PE 了解不多,但我在 PE 查看器中打开了其中一个 DLL,它只显示MSVBVM60.dll在导入部分。这似乎是 VB6 生成的类型库的一个特殊怪癖:它们仅链接到MSVBVM60其余依赖项,但具有某种延迟加载机制。
  • 即使我尝试过的大多数现有工具都没有提供信息——例如,depends.exe 只能找到MSVBVM60.dll.
  • 但是:OLEView,一个用于与 Visual Studio 一起发布的实用程序,以某种方式生成了一个 IDL 文件,其中包含importlib指令。鉴于 VB 不使用 IDL 文件,它显然是在以某种方式生成信息。所以这是可能的——我只是不知道怎么做。

真的,如果 OLEView 不这样做,我现在已经放弃了,因为这是不可能的。关于如何做到这一点的任何想法?

4

1 回答 1

1

事实证明,我将基本的 DLL 功能和 COM 混为一谈。(并非所有 DLL 都是 COM DLL。)

对于基本 DLL,Portable Executable 格式包括一个描述其导入的部分。Optional Header 的目录 1 是关于 DLL 的导入的。其结构由 给出IMAGE_IMPORT_DESCRIPTOR是了解这一点的起点。

COM DLL 似乎没有这样的等价物,但您可以发现它的公共接口需要哪些其他 COM 组件:对于每个公开的接口,列出它们的属性类型和方法参数,然后使用注册表查看这些类型的来源。tlbinf32.dll为列出成员等提供一些基本功能。这里是和介绍。

于 2014-08-24T03:03:56.063 回答