Expor eventos no SDK do Visual Studio
O Visual Studio permite que você origine eventos usando automação. Recomendamos que você origine eventos para projetos e itens de projeto.
Os eventos são recuperados por consumidores de automação do objeto Events ou GetObject (por exemplo, GetObject("EventObjectName")
). O ambiente chama IDispatch::Invoke
usando os sinalizadores DISPATCH_METHOD
ou DISPATCH_PROPERTYGET
para retornar um evento.
O processo a seguir explica como os eventos específicos do VSPackage são retornados.
O estado do ambiente.
Ele lê do Registro todos os nomes de valor sob as chaves Automation, AutomationEvents e AutomationProperties de todos os VSPackages e armazena esses nomes em uma tabela.
Um consumidor de automação chama, neste exemplo,
DTE.Events.AutomationProjectsEvents
ouDTE.Events.AutomationProjectItemsEvents
.O ambiente localiza o parâmetro de sequência na tabela e carrega o VSPackage correspondente.
O ambiente chama o método GetAutomationObject usando o nome informado na chamada; neste exemplo,
AutomationProjectsEvents
ouAutomationProjectItemsEvents
.O VSPackage cria um objeto raiz que tem métodos como
get_AutomationProjectsEvents
eget_AutomationProjectItemEvents
e, em seguida, retorna um ponteiro IDispatch para o objeto.O ambiente chama o método apropriado com base no nome informado na chamada de automação.
O método
get_
cria outro objeto de evento baseado no IDispatch que implementa as interfacesIConnectionPointContainer
eIConnectionPoint
e retorna umIDispatchpointer
para o objeto.Para expor um evento usando automação, você deve responder a GetAutomationObject e observar as sequências adicionadas ao Registro. Na amostra de projeto básico, as sequências são BscProjectsEvents e BscProjectItemsEvents.
Entradas do Registro da amostra de projeto básico
Esta seção mostra onde adicionar valores de evento de automação ao Registro.
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\8.0\Packages\<PkgGUID>\AutomationEvents]
AutomationProjectEvents = Retorna o objeto AutomationProjectEvents
.
AutomationProjectItemEvents = Retorna o objeto AutomationProjectItemsEvents
.
Nome | Tipo | Intervalo | Descrição |
---|---|---|---|
Padrão (@) | REG_SZ | Não usado | Não utilizado. Você pode usar o campo de dados para documentação. |
AutomationProjectsEvents | REG_SZ | Nome do objeto de evento. | Apenas o nome da chave é relevante. Você pode usar o campo de dados para documentação. Este exemplo vem da amostra de projeto básico. |
AutomationProjectItemEvents | REG_SZ | Nome do objeto de evento | Apenas o nome da chave é relevante. Você pode usar o campo de dados para documentação. Este exemplo vem da amostra de projeto básico. |
Quando qualquer objeto de evento for solicitado por um consumidor de automação, crie um objeto raiz que tenha métodos para qualquer evento que o VSPackage suporte. O ambiente chama o método apropriado get_
neste objeto. Por exemplo, se DTE.Events.AutomationProjectsEvents
for chamado, o método get_AutomationProjectsEvents
no objeto raiz será invocado.
Modelo de automação para eventos
A classe CProjectEventsContainer
representa o objeto de origem para BscProjectsEvents e CProjectItemsEventsContainer
representa o objeto de origem para BscProjectItemsEvents.
Na maioria dos casos, você deve retornar um novo objeto para cada solicitação de evento porque a maioria dos objetos de evento usa um objeto de filtro. Ao disparar o evento, verifique esse filtro para confirmar se o manipulador de eventos está sendo chamado.
AutomationEvents.h e AutomationEvents.cpp contêm declarações e implementações das classes na tabela a seguir.
Classe | Descrição |
---|---|
CAutomationEvents |
Implementa um objeto raiz de evento, recuperado do objeto DTE.Events . |
CProjectsEventsContainer e CProjectItemsEventsContainer |
Implemente os objetos de origem de evento que disparam os eventos correspondentes. |
O exemplo de código a seguir mostra como responder a uma solicitação de um objeto de evento.
STDMETHODIMP CVsPackage::GetAutomationObject(
/* [in] */ LPCOLESTR pszPropName,
/* [out] */ IDispatch ** ppIDispatch)
{
ExpectedPtrRet(ppIDispatch);
*ppIDispatch = NULL;
if (_wcsicmp(pszPropName, g_wszAutomationProjects) == 0)
//Is the requested name our Projects object?
{
return GetAutomationProjects(ppIDispatch);
// Gets our Projects object.
}
else if (_wcsicmp(pszPropName, g_wszAutomationProjectsEvents) == 0)
//Is the requested name our ProjectsEvents object?
{
return CAutomationEvents::GetAutomationEvents(ppIDispatch);
// Gets our ProjectEvents object.
}
else if (_wcsicmp(pszPropName, g_wszAutomationProjectItemsEvents) == 0) //Is the requested name our ProjectsItemsEvents object?
{
return CAutomationEvents::GetAutomationEvents(ppIDispatch);
// Gets our ProjectItemsEvents object.
}
return E_INVALIDARG;
}
No código acima, g_wszAutomationProjects
é o nome da sua coleção de projetos (FigProjects), g_wszAutomationProjectsEvents
(FigProjectsEvents) e g_wszAutomationProjectItemsEvents
(FigProjectItemEvents) são os nomes de eventos de projeto e eventos de itens de projeto que são originados da implementação do VSPackage.
Os objetos de evento são recuperados da mesma localização central, o objeto DTE.Events
. Dessa forma, todos os objetos de evento são agrupados para que um usuário final não precise procurar o modelo de objeto inteiro para localizar um evento específico. Isso também permite que você forneça seus objetos do VSPackage específicos, em vez de exigir que você implemente seu próprio código para eventos de todo o sistema. No entanto, para o usuário final, que deve localizar um evento para a interface ProjectItem
, não está imediatamente claro de onde esse objeto de evento é recuperado.