有没有人知道VBA实际上是如何从一个引用找到要加载的COM对象?
例如,参考" Microsoft Forms 2.0对象库"与GUID {0D452EE1-E08F-101A-852E-02608C4D0BB4}相关联,它似乎是一个类型库。那怎么找到文件呢?我怀疑是否完整路径" C:\ Windows \ SysWOW64 \ FM20.DLL"已经在插件中进行了硬编码。
涉及大量混乱的注册表项,任何人都知道它们实际上是如何工作的? (我怀疑答案是否定的,最后的COM程序员已经死了,但是仍然存在令人惊奇的代码!)
内置对象必须有一些额外的魔力,根据Office版本自动更改。
我问的原因是,当我尝试运行我编写的Excel VBA插件时,我有用户报告编译错误错误,我怀疑他们在系统中丢失了文件。因此,在我的简单安装程序中查看一些代码会很好。
答案 0 :(得分:4)
如果您打开regedit
并搜索0D452EE1-E08F-101A-852E-02608C4D0BB4
密钥,则会在HKEY_CLASSES_ROOT
hive下找到一个密钥:
2.0
键包含PrimaryInteropAssemblyName
字符串值:
Microsoft.Vbe.Interop.Forms, Version=11.0.0.0, Culture=neutral, PublicKeyToken=71E9BCE111E9429C
这适用于.NET。查看win32
键:
FM20.DLL
的确切位置!
这就是它的全部内容......没有魔力。
整个VBA项目实际上 需要编译才能运行:您可以拥有一个完全损坏的项目,并且仍然有一个可运行的模块,您可以调用并运行该模块的成员。我不知道你的“更简单的安装程序”是做什么的,但是如果你想知道你的任何引用是否被破坏,你可以使用VBIDE API(需要显式授权来运行)来迭代{{1在特殊的“故障排除”模块中查看是否有VBPRoject.References
中的任何一个。