COM 如何处理 VBA 引用?

How are VBA References handled by COM?

有谁知道 VBA 实际上是如何从引用到找到要加载的 COM 对象的?

例如,引用 "Microsoft Forms 2.0 Object Library" 与 GUID {0D452EE1-E08F-101A-852E-02608C4D0BB4} 关联,这似乎是一个类型库。那么它是如何找到文件的呢?我怀疑完整路径 "C:\Windows\SysWOW64\FM20.DLL" 是否已硬编码在插件中。

其中涉及大量的注册表项,有人知道它们的实际工作原理吗? (我怀疑答案是否定的,随着最后的 COM 程序员死去,但奇妙的代码仍然存在!)

内置对象一定有一些额外的魔力,它们会根据 Office 版本自动更改。

我问的原因是我有用户在尝试 运行 我写的 Excel VBA 插件时报告编译错误错误,我怀疑他们在他们的文件中丢失了文件系统。因此,如果我的简单安装程序中有一些代码可供查看,那就太好了。

如果您打开 regedit 并搜索 0D452EE1-E08F-101A-852E-02608C4D0BB4 键,您会在 HKEY_CLASSES_ROOT 配置单元下找到一个:

2.0 键包含一个 PrimaryInteropAssemblyName 字符串值:

Microsoft.Vbe.Interop.Forms, Version=11.0.0.0, Culture=neutral, PublicKeyToken=71E9BCE111E9429C

这是供 .NET 使用的。在win32键下看:

FM20.DLL!

的确切位置

这就是它的全部...没有魔法。


整个VBA项目实际上不需要编译成运行:你可以有一个完全损坏的项目,但仍然有一个模块这行得通,您可以调用该模块的 运行 成员。我不知道你的 "simpler installer" 是做什么的,但如果你想知道你的任何引用是否被破坏,你可以使用 VBIDE API (需要明确授权 运行) 迭代 VBPRoject.References 并查看它们中的任何一个 IsBroken,在一个特殊的专用 "troubleshooting" 模块中。