我的软件包是用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()
{
}
...
};
答案 0 :(得分:2)
在类.h文件中实现以下方法,并在Sleep
处设置断点void PostSited(IVsPackageEnums::SetSiteResult /*result*/)
{
Sleep(2500);//initilialize will sleep for some time
}
以下是自动加载示例:
[$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)中选择的指导,并寻找您项目的指导[再次,在我的情况下它是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等,我建议您这样做。