2017-04-21 58 views
0

有誰知道VBA是如何從一個參考找到一個COM對象來加載?COM如何處理VBA引用?

例如,引用「Microsoft Forms 2.0對象庫」與GUID {0D452EE1-E08F-101A-852E-02608C4D0BB4}關聯,這似乎是一個類型庫。那麼它如何找到該文件?我懷疑完整路徑「C:\ Windows \ SysWOW64 \ FM20.DLL」是否已在插件中硬編碼。

有一個涉及註冊表鍵的巨大糾結,任何人都知道他們是如何工作的? (我懷疑答案是否定的,最後的COM程序員會死掉,但代碼的精妙程度依然存在!)

對於根據Office版本自動更改的內置對象,必須有一點額外的魔力。

我問的原因是當我嘗試運行我編寫的Excel VBA插件時,我有用戶報告編譯錯誤錯誤,我懷疑他們在系統中缺少文件。因此,在我的簡單安裝程序中查看一些代碼會很好。

回答

4

如果你打開regedit和搜索0D452EE1-E08F-101A-852E-02608C4D0BB4鍵,你會發現一個HKEY_CLASSES_ROOT配置單元下:

HKCR key

2.0鍵包含一個PrimaryInteropAssemblyName字符串值:

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

這是.NET的使用。看win32項下:

location of FM20.DLL

FM20.DLL的確切位置!

這幾乎都有它......沒有魔力。


一整個VBA項目不實際上需要編譯運行:你可以有一個完全斷裂的項目,而且還有一個模塊的工作原理,你可以調用並運行該模塊的成員。我不知道你的「簡單安裝程序」是幹什麼的,但是如果你想知道你的任何引用是否被破壞,你可以使用VBIDE API(需要明確授權才能運行)迭代VBPRoject.References並查看如果其中任何一個IsBroken,在一個特殊的專用「故障排除」模塊。

+0

VBIDE無法工作,它始終在用戶計算機上禁用。 (不知道爲什麼給任何插件可以破解註冊表來設置它,所以不是真正的安全增益。)但我可以查找相關的密鑰。 – Tuntable

+0

謝謝。我在找錯地方。看起來像HKCR也將當前用戶與本地機器合併。這裏還有一個WOW64Node版本,會被忽略。 – Tuntable