Implémentation de l’objet COM du menu contextuel

Une extension de menu contextuel est un objet COM implémenté en tant que serveur in-proc. L’extension de menu contextuel doit implémenter les interfaces IShellExtInit et IContextMenu . Une extension de menu contextuel est instanciée lorsque l’utilisateur affiche le menu contextuel d’un objet d’une classe pour laquelle l’extension de menu contextuel a été inscrite.

Implémentation d’IShellExtInit

Une fois l’objet COM d’extension de menu contextuel instancié, la méthode IShellExtInit::Initialize est appelée. IShellExtInit::Initialize fournit l’extension de menu contextuel avec un objet IDataObject qui contient des données pertinentes pour l’objet de répertoire auquel le menu contextuel s’applique.

IDataObject contient des données au format CFSTR_DSOBJECTNAMES. Le format de données CFSTR_DSOBJECTNAMES est un HGLOBAL qui contient une structure DSOBJECTNAMES . La structure DSOBJECTNAMES contient des données sur l’objet de répertoire auquel s’applique l’extension de la feuille de propriétés.

IDataObject contient également des données au format CFSTR_DS_DISPLAY_SPEC_OPTIONS. Le format de données CFSTR_DS_DISPLAY_SPEC_OPTIONS est un HGLOBAL qui contient une structure DSDISPLAYSPECOPTIONS . DSDISPLAYSPECOPTIONS contient des données de configuration à utiliser par l’extension.

Si une valeur autre que S_OK est retournée à partir de IShellExtInit::Initialize, l’extension de menu contextuel n’est pas utilisée.

Les paramètres pidlFolder et hkeyProgID de la méthode IShellExtInit::Initialize ne sont pas utilisés.

Implémentation d’IContextMenu

Une fois que IShellExtInit::Initialize est retourné, la méthode IContextMenu::QueryContextMenu est appelée pour obtenir l’élément de menu ou les éléments que l’extension de menu contextuel ajoutera. L’implémentation de QueryContextMenu est assez simple. L’extension de menu contextuel ajoute ses éléments de menu à l’aide de la fonction InsertMenuItem ou similaire. Les identificateurs de commande de menu doivent être supérieurs ou égaux à idCmdFirst et être inférieurs à idCmdLast. QueryContextMenu doit retourner le plus grand identificateur numérique ajouté au menu plus un. La meilleure façon d’affecter des identificateurs de commande de menu consiste à démarrer à zéro et à travailler dans l’ordre. Si l’extension de menu contextuel n’a pas besoin d’un élément de menu, elle doit simplement ne pas ajouter d’éléments au menu et retourner zéro à partir de QueryContextMenu.

IContextMenu::GetCommandString est appelé pour récupérer les données textuelles de l’élément de menu, telles que le texte d’aide à afficher pour l’élément de menu. Il est possible que l’hôte du menu contextuel utilise des chaînes Unicode tandis que l’extension utilise des chaînes ANSI. Pour cette raison, les cas GCS_HELPTEXTA, GCS_HELPTEXTW, GCS_VERBA et GCS_VERBW doivent être traités individuellement. L’implémentation de cette méthode est facultative.

IContextMenu::InvokeCommand est appelé quand l’un des éléments de menu installés par l’extension de menu contextuel est sélectionné. Le menu contextuel effectue ou lance les actions souhaitées en réponse à cette méthode.