使用C ++进行VSPackage开发,如何在启动visual studio时初始化我的包

时间:2016-10-22 07:29:24

标签: c++ visual-studio vspackage

我的软件包是用C ++,VS2015开发的。 例如,我在项目菜单和工具栏中定义了一些命令,当我启动VS时,工具栏菜单很好,但项目菜单中的命令没有出现,那么我必须点击工具栏菜单中的任何按钮然后项目菜单中的命令返回。 我想在启动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 个答案:

答案 0 :(得分:2)

  1. 也许你不应该在你的班级的构造函数中初始化其他方法的代码。
  2. 在类.h文件中实现以下方法,并在Sleep

    处设置断点
    void PostSited(IVsPackageEnums::SetSiteResult /*result*/)
    {
        Sleep(2500);//initilialize will sleep for some time
    }
    
    1. 请务必在项目 .pkgdef 文件中设置正确的自动加载注册表项,在我的情况下,是在从向导创建vspackage项目后{f1536ef8-92ec -443c-9ed7-fdadf150da82}然后放入你的项目的guid,它说03be14ec-1a85-4c5c-a1f4-723d189c2e4c
    2. 以下是自动加载示例:

      [$RootKey$\AutoLoadPackages\{f1536ef8-92ec-443c-9ed7-fdadf150da82}]
      "{03be14ec-1a85-4c5c-a1f4-723d189c2e4c}"=dword:00000000
      
      1. 有关选择哪个guid的更多信息,请访问:https://msdn.microsoft.com/en-us/library/microsoft.visualstudio.shell.interop.uicontextguids80.aspx

      2. 现在按F5键,你应该点击断点。您可以通过导航到

        来验证注册表项是否在注册表中正确设置

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

        (其中{f1536ef8-92ec-443c-9ed7-fdadf150da82}是您从步骤3)中选择的指导,并寻找您项目的指导[再次,在我的情况下它是03be14ec-1a85- 4c5c-a1f4-723d189c2e4c,但你的必须不同]。如果不存在,则需要手动添加。

答案 1 :(得分: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等,我建议您这样做。