2016-08-22 51 views
1

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) 

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

回答

2

主机没有明确的VBIDE对象模型暴露出来,但也有一些用于获取一个参考主机的方法:

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

  2. 检查VBE的标准CommandBar中的第一个按钮的标题,在Excel中为“查看Microsoft Excel(Alt + F11)”。一旦你知道了主机的名称,你可以建立使用的字符串GetObject

  3. 使用Properties collection of a vbComponent such as ThisWorkbook`返回到应用程序的引用。这种方法只有在项目具有文档类型的vbComponent时才有效。像PowerPoint和Access这样的主机不一定有文档类型的组件。这种方法还要求有至少一个项目的开放和未受保护:

    Dim app As Excel.Application 
    Set app = _vbe.ActiveVBProject.VBComponents("ThisWorkbook").Properties("Parent").Object 
    
  4. 使用辅助(GetAccessibleObject)得到一个手柄寿从VBE的的ProcessID(可以从VBE的HWND获得主机)。请参阅下面的问题链接了解更多详情。

Rubberduck不得不做多个主机同样的事情,在C#外接的VBE。看看GitHubhere以及此相关的源代码issue

+1

非常感谢您解释编辑问题的解释。我需要一段时间吃这一切:)我试图使用在主机应用程序打开的文件的扩展名,但是当文件是新的并且没有保存在磁盘上时仍然存在问题:)我认为你的答案会对我有帮助。我会研究你的链接。再次感谢你。 – user6698332

+0

是的,文件扩展名是另一种方法,但如您所见,未保存的文件存在问题。没有任何文档的主机也是如此。 – ThunderFrame