找出激活加载项的主机应用程序

Find out the host application in which Add-In was activated

IDE 加载项是在 VB6 中创建的,适用于 VB6、Excel、Access 等
查看 Application & AddInInst 参数,传递给初始过程:

Private Sub AddinInstance_OnConnection( _
    ByVal Application As Object, _ 
    ByVal ConnectMode As AddInDesignerObjects.ext_ConnectMode, _
    ByVal AddInInst As Object, _
    custom() As Variant) 

我找不到任何明确的主机值。我在哪里可以找到主机的参考?
.

主机没有被 VBIDE object 模型显式公开,但是有很多方法可以获取对主机的引用:

  1. 检查 vbProject 的引用。宿主引用 通常 是项目的第二个引用。一旦知道引用的名称,就可以构建一个字符串以用于 GetObject。问题是,如果没有加载 VBProject,或者项目被保护,这个方法将不起作用。

  2. 检查 VBE 的标准命令栏中第一个按钮的标题,在 Excel 的情况下是 "View Microsoft Excel (Alt+F11)"。一旦知道主机名,就可以构建一个字符串以用于 GetObject

  3. 使用 Properties collection of a vbComponent such asThisWorkbook` 来 return 应用程序的引用。此方法仅在项目具有 document-type vbComponent 时才有效。 PowerPoint 和 Access 等主机不一定具有 document-type 组件。此方法还要求至少有一个项目处于打开状态且不受保护:

    Dim app As Excel.Application
    Set app = _vbe.ActiveVBProject.VBComponents("ThisWorkbook").Properties("Parent").Object
    
  4. 使用辅助功能 (GetAccessibleObject) 从 VBE 的 ProcessID(您可以从 VBE 的 Hwnd 获得)获取主机句柄。有关详细信息,请参阅下面的问题 link。

Rubberduck 不得不为 VBE 的 C# add-in 中的多个主机做同样的事情。查看 GitHub, and here and also this related issue

上的源代码