![]() |
Rückgabewert für QueryContextMenu erstellen
Mir geht es um das Erstellen des Rückgabewertes (HResult) für "QueryContextMenu".
Ich habe ein Programm geschrieben, bei dem ein Explorer-ContextmenuHandler benutzt wird, also eine DLL. In dieser DLL wird "QueryContextMenu" aufgerufen, wenn per Com-Objekt meine MenuItems in das Explorer-Kontextmeü eingefügt werden sollen. Worum es mir geht ist, den HResult-Rückgabewert korrekt zu erstellen. Derzeit weise ich einfach einen Zahlenwert zu, den ich statisch festlege. Also zum Beispiel:
Delphi-Quellcode:
Dieses Vorgehen habe ich aus einem
// wenn 2 MenuItems erstellt wurden, dann
Result := 2 ![]() Auszug aus der MSDN: Return Value If successful, returns an HRESULT value that has its severity value set to SEVERITY_SUCCESS and its code value set to the offset of the largest command identifier that was assigned, plus one. For example, assume that idCmdFirst is set to 5 and you add three items to the menu with command identifiers of 5, 7, and 8. The return value should be MAKE_HRESULT(SEVERITY_SUCCESS, 0, 8 - 5 + 1). Otherwise, it returns an OLE error value. Wie hier die MSDN erklärt, wird auch in einigen Beispielen mithilfe von MAKE_HRESULT der Rückgabewert erstellt. C++-Beispiel:
Code:
Siehe
return MAKE_HRESULT(SEVERITY_SUCCESS, 0, USHORT(IDM_LAST + 1));
![]() Ich verstehe die Zusammenhänge jedoch nicht komplett, wie HRESULT "zusammengebaut" wird und würde mich freuen, wenn mir das jemand "auf gut Deutsch" erklären würde, oder ein Tutorial / eine Erklärung verlinken würde, bei dem auch ich durchblicke. Guido. |
Re: Rückgabewert für QueryContextMenu erstellen
Hallo, weiß irgendjemand was? :wiejetzt:
|
Re: Rückgabewert für QueryContextMenu erstellen
Hallo Guido,
nach meinem Verständnis ist der Rückgabewert nicht von der Anzahl der bereitgestellten Menuitems abhängig, sondern entspricht einfach der Zahl der verbrauchten Command Identifier, gerechnet ab dem ersten möglichen in idCmdFirst übermittelten Wert. Dabei zählen eventuelle Lücken mit, die dadurch entstehen, dass du die ID-Werte nicht sequentiell vergibst. Die Shell rechnet diesen Wert auf idCmdFirst drauf, wenn sie die Kontrolle an den nächsten ContextMenuHandler weitergibt. Der als HRESULT zurückgegebene Wert (32 bit) ist gepackt. Das gesetzte höchste Bit signalisiert einen Fehler, die untersten 16 bit übermitteln im vorliegenden Fall das eigentliche Ergebnis. Da die oberen 16 bit bei dir 0 sind, kannst du auf MakeResult() verzichten. Freundliche Grüße |
Re: Rückgabewert für QueryContextMenu erstellen
Hallo marabu,
Zitat:
Beispiel: 1. MenuItem = idCmdFirst, 2. MenuItem = idCmdFirst + 1, 3. MenuItem = idCmdFirst + 3, <- ist das mit Lücke gemeint? Ist Result dann = 2 oder = 3? Ist das mit den Lücken so gemeint, dass ich die jeweilige wID frei vergeben kann? Oder ist damit gemeint, dass Lücken entstehen, wenn ich ein Untermenü erstelle und das MenuItem, mit dem das Untermenü aufgeklappt wird, einen Index erhält, der nicht ausgewertet werden kann (kein Click-Event)? Oder ganz was anderes? :gruebel: Zitat:
Viele Grüße, Guido. Edit: MAKE_HRESULT()-Frage hinzugefügt. |
Re: Rückgabewert für QueryContextMenu erstellen
Hallo nochmal,
Zitat:
Zitat:
Das Delphi-Pendant zum Makro MAKE_HRESULT() heißt MakeResult() und du findest es in der Unit ActiveX. Freundliche Grüße |
Re: Rückgabewert für QueryContextMenu erstellen
Zitat:
Zitat:
Zitat:
1. MenuItem = idCmdFirst // Value = 5 2. MenuItem = idCmdFirst + 1 // Value = 6, ist aber hier eine Lücke 3. MenuItem = idCmdFirst + 2 // Value = 7 4. MenuItem = idCmdFirst + 3 // Value = 8 Das ergibt inclusive der Lücke 4 MenuItems und somit einen Rückgabewert von 4 (siehe: 8 - 5 + 1). (Stimmt auch das soweit?) Zitat:
Zitat:
Guido. |
Re: Rückgabewert für QueryContextMenu erstellen
Da sehe ich jetzt keine Missverständnisse mehr.
Viel Erfolg mit deinem Projekt und ein schönes Wochenende wünsche ich dir. |
Re: Rückgabewert für QueryContextMenu erstellen
Hallo marabu,
vielen Dank für die Hilfe! Guido. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:48 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz