【问题标题】:Find out the host application in which Add-In was activated找出激活加载项的主机应用程序
【发布时间】:2016-08-22 23:01:35
【问题描述】:

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) 

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

【问题讨论】:

    标签: excel vba ms-access vb6 vbide


    【解决方案1】:

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

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

    2. 检查 VBE 标准命令栏中的第一个按钮的标题,在 Excel 中为“查看 Microsoft Excel (Alt+F11)”。一旦您知道主机的名称,您就可以构建一个字符串用于GetObject

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

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

    Rubberduck 不得不为 VBE 的 C# 插件中的多个主机执行相同的操作。查看GitHubhere 上的源代码以及相关的issue

    【讨论】:

    • 非常感谢您对问题的解释和编辑。我需要时间吃完这一切:)我试图使用在主机应用程序中打开的文件扩展名,但是当文件是新文件并且仍未保存在磁盘上时会出现问题:)我认为你的回答会对我有所帮助。我会研究你的链接。再次感谢您。
    • 是的,文件扩展名是另一种方法,但正如您所见,未保存的文件是有问题的。没有任何文件打开的主机也是如此。
    猜你喜欢
    • 2012-05-17
    • 1970-01-01
    • 2019-12-01
    • 2019-11-01
    • 2012-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-24
    相关资源
    最近更新 更多