Implementieren des COM-Objekts im Kontextmenü

Eine Kontextmenüerweiterung ist ein COM-Objekt, das als Prozessserver implementiert wird. 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, für das das Kontextmenü gilt.

Das IDataObject enthält Daten im CFSTR _ DSOBJECTNAMES-Format. Das CFSTR _ DSOBJECTNAMES-Datenformat ist ein HGLOBAL-Objekt, 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 FORMAT CFSTR _ DS DISPLAY SPEC _ _ _ OPTIONS. Das CFSTR _ DS _ DISPLAY SPEC _ _ OPTIONS-Datenformat ist ein HGLOBAL-Format, das eine DSDISPLAYSPECOPTIONS-Struktur enthält. DSDISPLAYSPECOPTIONS enthält Konfigurationsdaten für die Verwendung durch die Erweiterung.

Wenn von IShellExtInit::Initializeein anderer Wert als S _ OK 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 die Menüelemente abzurufen, die von der Kontextmenüerweiterung hinzugefügt werden. Die QueryContextMenu-Implementierung ist recht 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 1 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ötigen, sollte sie dem Menü einfach keine Elemente hinzufügen und 0 (null) von 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 werden soll. Es ist möglich, dass der Kontextmenühost Unicode-Zeichenfolgen verwendet, während die Erweiterung ANSI-Zeichenfolgen verwendet. Aus diesem Grund 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 sie.