2016-08-22 53 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