Разработка VSPackage с использованием C++, как мне инициализировать мой пакет при запуске Visual Studio
Мой пакет разработан на 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 ответа
- Возможно, вам не следует помещать код, инициализирующий другие методы, в конструктор для вашего класса.
Реализуйте следующий метод в вашем файле класса.h и установите точку останова на Sleep
void PostSited(IVsPackageEnums::SetSiteResult /*result*/)
{
Sleep(2500);//initilialize will sleep for some time
}
- Убедитесь, что в вашем проекте.pkgdef правильно настроен ключ реестра автозагрузки, в моем случае это происходит после того, как проект vspackage был создан из мастера {f1536ef8-92ec-443c-9ed7-fdadf150da82}, а затем вставлен в guid вашего проекта. где написано 03be14ec-1a85-4c5c-a1f4-723d189c2e4c
Вот пример автозагрузки:
[$RootKey$\AutoLoadPackages\{f1536ef8-92ec-443c-9ed7-fdadf150da82}]
"{03be14ec-1a85-4c5c-a1f4-723d189c2e4c}"=dword:00000000
Дополнительную информацию о том, какое руководство выбрать, можно найти здесь: https://msdn.microsoft.com/en-us/library/microsoft.visualstudio.shell.interop.uicontextguids80.aspx
Теперь нажмите F5, и вы должны достичь точки останова. Вы можете проверить, правильно ли задан ключ реестра в реестре, перейдя к
HKEY_CURRENT_USER \ SOFTWARE \ Microsoft \ VisualStudio \ 14.0Exp_Config \ AutoLoadPackages \ {f1536ef8-92ec-443c-9ed7-fdadf150da82}
(где {f1536ef8-92ec-443c-9ed7-fdadf150da82} - это guid, выбранный вами на шаге 3) и ищущий guid вашего проекта [снова, в моем случае это 03be14ec-1a85-4c5c-a1f4-723d189c2e4c, но ваш должен отличаться ]. Вам нужно будет добавить его вручную, если его там нет.
Пакеты VS должны быть рассчитаны на загрузку при необходимости, а не на принудительную загрузку при запуске VS IDE (devenv.exe). Если бы все заставляли свои пакеты загружаться при запуске VS, вы бы очень долго ждали, чтобы Visual Studio фактически запустился.
Что вам следует делать, так это использовать раздел реестра AutoLoadPackages, чтобы указать, какие контексты активации должны загружать ваш пакет. Это очень легко с проектом пакета на основе VB или C#, так как все, что вам нужно сделать, это добавить атрибут ProvideAutoLoad в ваш объект пакета.
Но для пакетов на основе C++ вам нужно будет вручную отредактировать.pkgdef, чтобы добавить нужные записи.
При этом все команды меню определяются вашим файлом.VSCT, так что, скорее всего, проблема здесь в вашем файле.VSCT и в том, как вы объявляете или добавляете в родительские команды команду меню, которую пытаетесь добавить в контекстное меню проекта.
Используйте трюк с ключом реестра EnableVSIPLogging, чтобы убедиться, что вы определили правильную пару guid:id для интересующего вас контекстного меню.
(подсказка) Если вы используете VS 2015, вы также можете установить его с помощью расширения инструментов расширения Mads Kristensen. Я рекомендую это, особенно если вы редактируете.pkgdefs, .vsixmanifests и т.п.