【问题标题】:Get importlib directives from type library从类型库中获取 importlib 指令
【发布时间】:2014-07-15 00:35:50
【问题描述】:

如何以编程方式确定给定的原生 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 不这样做,我现在已经放弃了,因为这是不可能的。关于如何实现这一点的任何想法?

【问题讨论】:

标签: com portable-executable com+ tlbinf32


【解决方案1】:

原来我把基本的 DLL 功能和 COM 混为一谈了。 (并非所有 DLL 都是 COM DLL。)

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-30
    • 1970-01-01
    • 2023-01-20
    • 2016-02-06
    • 1970-01-01
    相关资源
    最近更新 更多