Visual Studio Add-in QueryStatus () chamadas

votos
2

Gostaria de saber se alguém pode me dizer por que QueryStatus()método de obter chamado tantas vezes quando o comando está sendo avaliado para execução? No meu caso, é chamado várias vezes (pelo menos 9) com pelo menos um vsCommandStatusTextWantedNamee muitos mais vsCommandStatusTextWantedNone, mas não com vsCommandStatusTextWantedStatus?

Então muitas QueryStatus()chamadas para apenas um Exec(). Por quê?

Detalhes exemplo
eu tenho apenas um comando e um CommandBarButton relacionado a ele, que reside no menu de contexto Janela Código. Sempre que eu à esquerda, clique dentro da janela de código, QueryStatus()deve ser chamado (como eu o entendo), três vezes, no máximo. Para cada vsCommandStatusTextWanteduma vez. Por que isso não é o caso nesta situação?

Publicado 19/05/2009 em 21:27
fonte usuário
Em outras línguas...                            


2 respostas

votos
3

A primeira parte Exec () é fácil: que só é chamado quando um comando é realmente invocado. QueryStatus () será chamado em momentos diferentes para atualizar elementos de interface do usuário, como itens de menu, botões da barra de ferramentas. Desde status pode ser diferente, dependendo do estado como: é o texto selecionado, é um projeto aberto, é um arquivo aberto, etc, ele precisa ser consultado para muitas vezes.

Editar : E se você tem vários comandos, então o status de cada um precisa ser consultado para mesmo se o usuário não acabe invocando qualquer um deles. Se você tem comandos que são visíveis (em um menu ou em uma barra de ferramentas), a interface do usuário precisa consultar sobre a sua aplicabilidade para o ambiente atual (que não é estático).

Respondeu 19/05/2009 em 21:59
fonte usuário

votos
2

VSPackages implementar IOleCommandTarget para lidar com QueryStatus chama do meio ambiente. Addins implementar uma interface similar - IDTCommandTarget. Mas IOleCommandTarget não usa a enumeração vsCommandStatusTextWanted que você tem em IDTCommandTarget.

Para um comando VSPackage no menu superior, QueryStatus é chamado uma vez por comando para comandos estáticas: para ver se o comando está habilitado.
Para comandos dinâmicos, QueryStatus é chamado duas vezes por comando: uma vez para ver se o comando deve ser visível e uma segunda vez para ver se ele está habilitado.

Aqui está a pilha de chamadas nativo para primeira chamada em um VSPackage IOleCommandTarget: QueryStatus:

msenv.dll!CVSCommandTarget::QueryStatusCmd()  + 0x9f9 bytes 
msenv.dll!CVSShellMenu::IsCommandVisible()  + 0x5f bytes    
msenv.dll!CVSShellMenu::IsCommandVisible()  + 0x10f bytes   
msenv.dll!CMsoButtonUser::FAutoVisible()  + 0x16 bytes  
msenv.dll!CVSShellMenu::IsMenuVisible()  + 0x21bf bytes 
msenv.dll!CMsoMenuUser::FAutoVisible()  + 0x3f bytes    
msenv.dll!TBC::FAutoVisible()  + 0x31 bytes 
msenv.dll!TB::CalcRectOrReflowToolbar()  + 0x351 bytes  
msenv.dll!TB::FSetBestRectEx()  - 0x5958d bytes 
msenv.dll!TB::FShowTbInternal()  + 0x13835a bytes   
msenv.dll!TB::FPlacePopup()  + 0x114 bytes  
msenv.dll!TBComponentPopup::ModalPopup()  + 0x93 bytes  
msenv.dll!TB::FPopup()  + 0x133 bytes   
msenv.dll!CVSShellMenu::ShowContextMenu()  + 0x172 bytes
 ....

E a pilha de chamadas para a segunda chamada:

msenv.dll!CVSCommandTarget::QueryStatusCmd()  + 0x9f9 bytes 
msenv.dll!CVSShellMenu::IsCommandVisible()  + 0x5f bytes    
msenv.dll!CVSShellMenu::IsCommandVisible()  + 0x10f bytes   
msenv.dll!CMsoButtonUser::FAutoVisible()  + 0x16 bytes  
msenv.dll!CVSShellMenu::IsMenuVisible()  + 0x21bf bytes 
msenv.dll!CMsoMenuUser::FEnabled()  + 0xc5 bytes    
msenv.dll!TBC::FEnabled()  + 0x54 bytes 
msenv.dll!TBCM::FEnabled()  + 0x1b bytes    
msenv.dll!TBCM::FUpdate()  + 0x2e bytes 
msenv.dll!TB::CalcRectOrReflowToolbar()  + 0x689 bytes  
msenv.dll!TB::FSetBestRectEx()  - 0x5958d bytes 
msenv.dll!TB::FShowTbInternal()  + 0x13835a bytes   
msenv.dll!TB::FPlacePopup()  + 0x114 bytes  
msenv.dll!TBComponentPopup::ModalPopup()  + 0x93 bytes  
msenv.dll!TB::FPopup()  + 0x133 bytes   
msenv.dll!CVSShellMenu::ShowContextMenu()  + 0x172 bytes    
 ....

Eu suspeito que o seu comando (ou comandos Addin em geral?) São tratados como dinâmico (com texto dinâmico), mas não pode adivinhar por que motivo um único comando teria QueryStatus chamado 9 vezes consecutivas, se ele não aparece em uma barra de ferramentas ou menu de nível superior (somente no menu de contexto). Então, eu podia ver 3 chamadas QueryStatus: é visível, está habilitado, obter texto. 9 sendo um múltiplo de 3 é interessante ...

Se você não tem a configuração do servidor símbolo para o depurador, gostaria de obtê-lo configurado de modo que você pode conferir o msenv.dll chama para obter qualquer indicação de como eu fiz acima para o VSPackage QueryStatus chama.

Respondeu 28/05/2009 em 01:28
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more