Implementieren des KONTEXTMENÜ-COM-Objekts
Eine Kontextmenüerweiterung ist ein COM-Objekt, das als in-proc-Server implementiert ist. Die Kontextmenüerweiterung muss die Schnittstellen IShellExtInit und IContextMenu implementieren. Eine Kontextmenüerweiterung wird instanziiert, wenn der Benutzer das Kontextmenü für ein Objekt einer Klasse anzeigt, für das die Kontextmenüerweiterung registriert wurde.
Implementieren von IShellExtInit
Nachdem das COM-Objekt der Kontextmenüerweiterung instanziiert wurde, wird die IShellExtInit::Initialize-Methode aufgerufen. IShellExtInit::Initialize stellt die Kontextmenüerweiterung mit einem IDataObject-Objekt bereit, das Daten enthält, die für das Verzeichnisobjekt relevant sind, auf das das Kontextmenü angewendet wird.
Das IDataObject enthält Daten im CFSTR_DSOBJECTNAMES Format. Das CFSTR_DSOBJECTNAMES Datenformat ist ein HGLOBAL , das eine DSOBJECTNAMES-Struktur enthält. Die DSOBJECTNAMES-Struktur enthält Daten über das Verzeichnisobjekt, für das die Eigenschaftenblatterweiterung gilt.
Das IDataObject enthält auch Daten im CFSTR_DS_DISPLAY_SPEC_OPTIONS-Format . Das CFSTR_DS_DISPLAY_SPEC_OPTIONS Datenformat ist ein HGLOBAL , das eine DSDISPLAYSPECOPTIONS-Struktur enthält. DSDISPLAYSPECOPTIONS enthält Konfigurationsdaten zur Verwendung durch die Erweiterung.
Wenn ein anderer Wert als S_OK von IShellExtInit::Initialize zurückgegeben wird, wird die Kontextmenüerweiterung nicht verwendet.
Die Parameter pidlFolder und hkeyProgID der IShellExtInit::Initialize-Methode werden nicht verwendet.
Implementieren von IContextMenu
Nachdem IShellExtInit::Initialize zurückgegeben wurde, wird die IContextMenu::QueryContextMenu-Methode aufgerufen, um das Menüelement oder die Elemente abzurufen, die von der Kontextmenüerweiterung hinzugefügt werden. Die QueryContextMenu-Implementierung ist ziemlich einfach. Die Kontextmenüerweiterung fügt ihre Menüelemente mithilfe der InsertMenuItem-Funktion oder einer ähnlichen Funktion hinzu. Die Menübefehlsbezeichner müssen größer oder gleich idCmdFirst und kleiner als idCmdLast sein. QueryContextMenu muss den größten numerischen Bezeichner zurückgeben, der dem Menü plus eins hinzugefügt wurde. Die beste Möglichkeit zum Zuweisen von Menübefehlsbezeichnern besteht darin, bei null zu beginnen und nacheinander zu arbeiten. Wenn die Kontextmenüerweiterung keine Menüelemente benötigt, sollte sie dem Menü einfach keine Elemente hinzufügen und null aus QueryContextMenu zurückgeben.
IContextMenu::GetCommandString wird aufgerufen, um Textdaten für das Menüelement abzurufen, z. B. Hilfetext, der für das Menüelement angezeigt wird. Es ist möglich, dass der Kontextmenühost Unicode-Zeichenfolgen verwendet, während die Erweiterung ANSI-Zeichenfolgen verwendet. Aus diesem Gründen müssen die GCS_HELPTEXTA, GCS_HELPTEXTW, GCS_VERBA und GCS_VERBW Fälle einzeln behandelt werden. Die Implementierung dieser Methode ist optional.
IContextMenu::InvokeCommand wird aufgerufen, wenn eines der Von der Kontextmenüerweiterung installierten Menüelemente ausgewählt ist. Das Kontextmenü führt die gewünschten Aktionen als Reaktion auf diese Methode aus oder initiiert diese.