Надстройки могут реагировать на команды, выдаваемые внутри интегрированной среды. Если вы помните из обсуждения команд в главах 11 и 12, то это делается при помощи концепции "именованных команд". Именованная команда — это просто действие, которое имеет имя. Вы уже знаете, что Visual Studio имеет огромный список собственных команд, которые соответствуют широкому разнообразию действий, имеющихся в интегрированной среде. Используя коллекцию Commands/Commands2, вы можете создать собственные именованные команды (при помощи метода AddNamedCommand2).
Еще раз возвратимся к анализу метода OnConnection: мастер создал тело кода, отвечающего за создание новой именованной команды, добавление ее в меню Tools и для последующего реагирования на команду. Метод IDTCommandTarget .Exec— это перехватчик, используемый для реагирования на выданную команду. Вот его прототип:
void Exec (
[InAttribute] string QmdName,
[InAttribute] vsCommandExecOption ExecuteOption,
[InAttribute] ref Object VariantIn,
[InAttribute] out Object VariantOut,
[InAttribute] out bool Handled
)
Для обработки команды, выданной надстройке, вы пишете код в методе Ехес, который реагирует на переданную в него команду.
CmdName — это строка, содержащая имя команды; это метка, используемая для уникальной идентификации команды — и, таким образом, она является тем параметром, который вы будете изучать в теле метода Ехес для того, чтобы определить, будете ли вы реагировать на команду и каким именно образом.
ExecuteOption— это перечисление vsCommandExecOption, которое предоставляет информацию об опциях, связанных с командой (табл. 13.4).
Параметр Variant In используется для передачи любых аргументов, необходимых для входящей команды, a VariantOut служит для передачи информации из надстройки обратно вызывающей стороне.
Наконец, Handled показывает хост-приложению, обработала ли надстройка команду. Как правило, если ваша надстройка обработала команду, то она устанавливает его в true. В противном случае она будет установлена в false, что является сигналом для Visual Studio о том, что ей нужно продолжить поиск обработчика команды.