2016-10-22 69 views
0

我的包是用C++,VS2015開發的。 例如,我在項目菜單和工具欄中定義了一些命令,當我啓動VS時,工具欄菜單很好,但是項目菜單中的命令沒有出現,那麼我必須點擊工具欄菜單中的任何按鈕,然後項目菜單中的命令返回。 當啓動visual studio或打開一個項目時,我想要我的包初始化項目菜單命令。使用C++開發VSPackage,如何在啓動時初始化我的包visual studio

我喜歡這個

class ATL_NO_VTABLE CYHMExtensionsPackage : 
    public CComObjectRootEx<CComSingleThreadModel>, 
    public CComCoClass<CYHMExtensionsPackage, &CLSID_YHMExtensions>, 
    // Provides the implementation for IVsPackage to make this COM object into a VS Package. 
    public IVsPackageImpl<CYHMExtensionsPackage, &CLSID_YHMExtensions>, 
    public IOleCommandTargetImpl<CYHMExtensionsPackage>, 
    // Provides consumers of this object with the ability to determine which interfaces support extended error information. 
    public ATL::ISupportErrorInfoImpl<&__uuidof(IVsPackage)> 
{ 
public: 
// Provides a portion of the implementation of IUnknown, in particular the list of interfaces 
// the CYHMExtensionsPackage object will support via QueryInterface 
BEGIN_COM_MAP(CYHMExtensionsPackage) 
    COM_INTERFACE_ENTRY(IVsPackage) 
    COM_INTERFACE_ENTRY(IOleCommandTarget) 
    COM_INTERFACE_ENTRY(ISupportErrorInfo) 
END_COM_MAP() 
VSL_DECLARE_NOT_COPYABLE(CYHMExtensionsPackage) 
public: 
    CYHMExtensionsPackage():m_dwEditorCookie(0), m_MyToolWindow(GetVsSiteCache()) 
    { 
     GetYHMVSSolution(); 
    } 
    ~CYHMExtensionsPackage() 
    { 
    } 
... 
}; 

回答

2
  1. 代碼也許你不應該把代碼初始化在構造函數類的其他方法。

在睡眠

實現類.h文件中下面的方法和設置斷點
void PostSited(IVsPackageEnums::SetSiteResult /*result*/) 
{ 
    Sleep(2500);//initilialize will sleep for some time 
} 
  • 確保有適當的自動加載註冊表鍵設置在項目.pkgdef文件,在我的情況下,它是從嚮導{f1536ef8-92ec-443c-9ed7-fdadf150da82}創建vspackage的項目之後,然後放入項目的guid中,它表示03be14ec-1a85-4c5c-a1f4 -723d189c2e4c
  • 下面是一個例子的自動加載:

    [$RootKey$\AutoLoadPackages\{f1536ef8-92ec-443c-9ed7-fdadf150da82}] 
    "{03be14ec-1a85-4c5c-a1f4-723d189c2e4c}"=dword:00000000 
    
  • 在其GUID來選擇的更多信息可在這裏找到:https://msdn.microsoft.com/en-us/library/microsoft.visualstudio.shell.interop.uicontextguids80.aspx

  • 現在按F5和你應該打斷點。您可以驗證該註冊表鍵在註冊表中通過導航到

    HKEY_CURRENT_USER \ SOFTWARE \微軟\ VisualStudio的\ 14.0Exp_Config \ AutoLoadPackages \ {f1536ef8-92ec-443C-9ed7-fdadf150da82}

    (其中正確設置{f1536ef8-92ec-443c-9ed7-fdadf150da82}是你從步驟3中選擇的guid並尋找你的項目的guid [在我的情況下,它是03be14ec-1a85-4c5c-a1f4-723d189c2e4c,但你必須是不同的]。如果不存在,您需要手動添加它。

  • 0

    VS包應該設計爲在需要時加載,而不是在VS IDE(devenv.exe)啓動時強制加載。如果每個人都迫使他們的軟件包加載VS啓動,那麼您將等待很長時間才能真正開始Visual Studio。

    應該在做什麼,正在利用AutoLoadPackages registry key來指定哪些激活上下文應該加載您的包。這對於基於VB或C#的軟件包項目來說非常簡單,因爲您只需將ProvideAutoLoad attribute添加到軟件包對象中即可。

    但是對於基於C++的軟件包,您需要手動編輯.pkgdef以添加所需的條目。

    所有人都說,菜單命令是由.VSCT文件定義的,所以這裏的問題很可能出在您的.VSCT文件,以及您如何聲明或父母化您嘗試添加到項目上下文中的菜單命令菜單。

    使用EnableVSIPLogging registry key trick,以確認您已經確定了正確的GUID:ID對的上下文菜單中,您有興趣

    (提示)如果你正在使用VS 2015年,您還可以通過Mads Kristensen's Extensibility Tools extension設置此。我特別推薦這個,如果你在編輯.pkgdefs,.vsixmanifests之類的東西。

    相關問題