Разработка 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()
{
}
...
};

0

Решение

  1. Возможно, вам не следует помещать код, инициализирующий другие методы, в конструктор для вашего класса.

Реализуйте следующий метод в вашем файле класса .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

Вот пример автозагрузки:

[$RootKey$\AutoLoadPackages\{f1536ef8-92ec-443c-9ed7-fdadf150da82}]
"{03be14ec-1a85-4c5c-a1f4-723d189c2e4c}"=dword:00000000
  1. Более подробную информацию о том, какой гид выбрать, можно найти здесь: https://msdn.microsoft.com/en-us/library/microsoft.visualstudio.shell.interop.uicontextguids80.aspx

  2. Теперь нажмите 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, но ваш должен отличаться ]. Вам нужно будет добавить его вручную, если его там нет.

2

Другие решения

Пакеты VS должны быть рассчитаны на загрузку при необходимости, а не на принудительную загрузку при запуске VS IDE (devenv.exe). Если бы все заставляли свои пакеты загружаться при запуске VS, вы бы очень долго ждали, чтобы Visual Studio фактически запустился.

Что ты должен делать, использует Раздел реестра AutoLoadPackages, указать, какие контексты активации должны загружать ваш пакет. Это очень легко с проектом пакета на основе VB или C #, так как все, что вам нужно сделать, это добавить Атрибут ProvideAutoLoad к вашему объекту пакета.

Но для пакетов на основе C ++ вам нужно будет вручную отредактировать .pkgdef, чтобы добавить нужные записи.

При этом все команды меню определяются вашим файлом .VSCT, так что, скорее всего, проблема здесь в вашем файле .VSCT и в том, как вы объявляете или добавляете в родительские команды команду меню, которую пытаетесь добавить в контекстное меню проекта.

Использовать Включить трюк с ключом реестра VSIPLogging, чтобы убедиться, что вы определили правильную пару guid: id для интересующего вас контекстного меню.

(подсказка) Если вы используете VS 2015, вы также можете установить это через Расширение Mads Kristensen’s Tools для расширения возможностей. Я рекомендую это, особенно если вы редактируете .pkgdefs, .vsixmanifests и т.п.

0

По вопросам рекламы [email protected]