从类型库中获取importlib指令

时间:2014-07-15 00:35:51

标签: com portable-executable com+ tlbinf32

如何以编程方式确定给定的本机,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没有这样做,我现在已经放弃它是不可能的。有关如何实现这一点的任何想法?

1 个答案:

答案 0 :(得分:1)

事实证明,我正在混淆基本的DLL功能和COM。 (并非所有DLL都是COM DLL。)

对于基本DLL,可移植可执行文件格式包括描述其导入的部分。可选标题目录1是关于DLL的导入。其结构由IMAGE_IMPORT_DESCRIPTOR给出。 This是了解这一点的起点。

COM DLL似乎没有这样的等价物,但您可以发现其公共接口需要哪些其他COM组件:对于每个公开的接口,列出其属性的类型及其方法参数,然后使用Registry查找这些类型的来源。 tlbinf32.dll提供了列出会员等的一些基本功能,Here及其简介。