Implementando o objeto COM do menu de contexto

Uma extensão de menu de contexto é um objeto COM implementado como um servidor in-proc. A extensão de menu de contexto deve implementar as interfaces IShellExtInit e IContextMenu. Uma extensão de menu de contexto é instanciada quando o usuário exibe o menu de contexto para um objeto de uma classe para a qual a extensão de menu de contexto foi registrada.

Implementando IShellExtInit

Depois que o objeto COM da extensão de menu de contexto é instanciado, o método IShellExtInit::Initialize é chamado. IShellExtInit::Initialize fornece a extensão de menu de contexto com um objeto IDataObject que contém dados pertinentes ao objeto de diretório ao qual o menu de contexto se aplica.

O IDataObject contém dados no formato CFSTR_DSOBJECTNAMES. O formato de dados CFSTR_DSOBJECTNAMES é um HGLOBAL que contém uma estrutura DSOBJECTNAMES . A estrutura DSOBJECTNAMES contém dados sobre o objeto de diretório ao qual a extensão de folha de propriedades se aplica.

O IDataObject também contém dados no formato CFSTR_DS_DISPLAY_SPEC_OPTIONS. O formato de dados CFSTR_DS_DISPLAY_SPEC_OPTIONS é um HGLOBAL que contém uma estrutura DSDISPLAYSPECOPTIONS . O DSDISPLAYSPECOPTIONS contém dados de configuração para uso pela extensão.

Se qualquer valor diferente de S_OK for retornado de IShellExtInit::Initialize, a extensão de menu de contexto não será usada.

Os parâmetros pidlFolder e hkeyProgID do método IShellExtInit::Initialize não são usados.

Implementando IContextMenu

Após IShellExtInit::Initialize retorna, o método IContextMenu::QueryContextMenu é chamado para obter o item de menu ou itens que a extensão de menu de contexto irá adicionar. A implementação de QueryContextMenu é bastante simples. A extensão de menu de contexto adiciona seus itens de menu usando o InsertMenuItem ou função semelhante. Os identificadores de comando de menu devem ser maiores ou iguais a idCmdFirst e devem ser menores que idCmdLast. QueryContextMenu deve retornar o maior identificador numérico adicionado ao menu mais um. A melhor maneira de atribuir identificadores de comando de menu é começar no zero e trabalhar em sequência. Se a extensão de menu de contexto não precisar de nenhum item de menu, ela simplesmente não deve adicionar nenhum item ao menu e retornar zero de QueryContextMenu.

IContextMenu::GetCommandString é chamado para recuperar dados textuais para o item de menu, como o texto de ajuda a ser exibido para o item de menu. É possível que o host do menu de contexto use cadeias de caracteres Unicode enquanto a extensão usa cadeias de caracteres ANSI. Por isso, os casos de GCS_HELPTEXTA, GCS_HELPTEXTW, GCS_VERBA e GCS_VERBW devem ser tratados individualmente. A implementação deste método é opcional.

IContextMenu::InvokeCommand é chamado quando um dos itens de menu instalados pela extensão de menu de contexto é selecionado. O menu de contexto executa ou inicia as ações desejadas em resposta a esse método.