Implementar el objeto COM del menú contextual

Una extensión de menú contextual es un objeto COM implementado como un servidor en proceso. La extensión de menú contextual debe implementar las interfaces IShellExtInit e IContextMenu . Se crea una instancia de una extensión de menú contextual cuando el usuario muestra el menú contextual de un objeto de una clase para la que se ha registrado la extensión del menú contextual.

Implementación de IShellExtInit

Después de crear una instancia del objeto COM de extensión de menú contextual, se llama al método IShellExtInit::Initialize . IShellExtInit::Initialize proporciona la extensión de menú contextual con un objeto IDataObject que contiene datos pertinentes para el objeto de directorio al que se aplica el menú contextual.

IDataObject contiene datos en el formato CFSTR_DSOBJECTNAMES. El formato de datos CFSTR_DSOBJECTNAMES es un HGLOBAL que contiene una estructura DSOBJECTNAMES . La estructura DSOBJECTNAMES contiene datos sobre el objeto de directorio al que se aplica la extensión de hoja de propiedades.

IDataObject también contiene datos en el formato CFSTR_DS_DISPLAY_SPEC_OPTIONS. El formato de datos CFSTR_DS_DISPLAY_SPEC_OPTIONS es un HGLOBAL que contiene una estructura DSDISPLAYSPECOPTIONS . DSDISPLAYSPECOPTIONS contiene los datos de configuración que usa la extensión.

Si se devuelve un valor distinto de S_OK desde IShellExtInit::Initialize, no se usará la extensión de menú contextual.

No se usan los parámetros pidlFolder y hkeyProgID del método IShellExtInit::Initialize .

Implementación de IContextMenu

Después de que se devuelva IShellExtInit::Initialize , se llama al método IContextMenu::QueryContextMenu para obtener el elemento de menú o los elementos que agregará la extensión del menú contextual. La implementación de QueryContextMenu es bastante sencilla. La extensión de menú contextual agrega sus elementos de menú mediante la función InsertMenuItem o similar. Los identificadores de comando de menú deben ser mayores o iguales que idCmdFirst y deben ser menores que idCmdLast. QueryContextMenu debe devolver el mayor identificador numérico agregado al menú más uno. La mejor manera de asignar identificadores de comando de menú es empezar en cero y funcionar en secuencia. Si la extensión de menú contextual no necesita ningún elemento de menú, simplemente no debe agregar ningún elemento al menú y devolver cero de QueryContextMenu.

Se llama a IContextMenu::GetCommandString para recuperar datos textuales del elemento de menú, como el texto de ayuda que se va a mostrar para el elemento de menú. Es posible que el host del menú contextual use cadenas Unicode mientras la extensión usa cadenas ANSI. Por este motivo, los casos de GCS_HELPTEXTA, GCS_HELPTEXTW, GCS_VERBA y GCS_VERBW deben controlarse individualmente. La implementación de este método es opcional.

Se llama a IContextMenu::InvokeCommand cuando se selecciona uno de los elementos de menú instalados por la extensión de menú contextual. El menú contextual realiza o inicia las acciones deseadas en respuesta a este método.