Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Rückgabewert für QueryContextMenu erstellen (https://www.delphipraxis.net/116904-rueckgabewert-fuer-querycontextmenu-erstellen.html)

Guido Eisenbeis 8. Jul 2008 13:45


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:
// wenn 2 MenuItems erstellt wurden, dann
Result := 2
Dieses Vorgehen habe ich aus einem Tutorial übernommen. Ich bin jedoch nicht wirklich überzeugt, ob es nicht eine bessere Vorgehensweise gibt.

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:
return MAKE_HRESULT(SEVERITY_SUCCESS, 0, USHORT(IDM_LAST + 1));
Siehe http://support.microsoft.com/kb/179911/de.

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.

Guido Eisenbeis 18. Jul 2008 09:18

Re: Rückgabewert für QueryContextMenu erstellen
 
Hallo, weiß irgendjemand was? :wiejetzt:

marabu 18. Jul 2008 12:28

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

Guido Eisenbeis 18. Jul 2008 16:45

Re: Rückgabewert für QueryContextMenu erstellen
 
Hallo marabu,

Zitat:

Zitat von marabu
... 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, ...

Verstehe ich das richtig, dass HRESULT gebildet wird aus der Gesamtanzahl der vergebenen MenuItem-IDs (MenuItemInfo-wID) minus 1 dafür, dass man mit idCmdFirst beginnt? Oder wird idCmdFirst mitgerechnet?

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:

Zitat von marabu
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.

Verstehe ich das richtig, dass ich dann also (wie im Posting #1 beschrieben) einfach Result := 2; zuweisen kann? MAKE_HRESULT() habe ich in Delphi auch nicht verwenden können. (Also diese oder eine entsprechende Funktion habe ich in Delphi nicht gefunden. :oops: )

Viele Grüße,
Guido.


Edit: MAKE_HRESULT()-Frage hinzugefügt.

marabu 18. Jul 2008 19:42

Re: Rückgabewert für QueryContextMenu erstellen
 
Hallo nochmal,

Zitat:

Zitat von Guido Eisenbeis
...
Beispiel:

1. MenuItem = idCmdFirst,
2. MenuItem = idCmdFirst + 1,
3. MenuItem = idCmdFirst + 3,
...

die nächste sequentiell zu vergebende ID wäre idCmdFirst + 4, zurückgeben musst du also 4, auch wenn du "idCmdFirst + 2" nicht vergeben hast.

Zitat:

Zitat von Guido Eisenbeis
... Ist das mit den Lücken so gemeint, dass ich die jeweilige wID frei vergeben kann? ...

Nicht ganz. Deine ID-Werte musst du aus dem Range idCmdFirst..idCmdLast nehmen, aber ansonsten bist du frei in deiner Wahl.

Das Delphi-Pendant zum Makro MAKE_HRESULT() heißt MakeResult() und du findest es in der Unit ActiveX.

Freundliche Grüße

Guido Eisenbeis 19. Jul 2008 13:59

Re: Rückgabewert für QueryContextMenu erstellen
 
Zitat:

Zitat von marabu
Beispiel:

1. MenuItem = idCmdFirst,
2. MenuItem = idCmdFirst + 1
3. MenuItem = idCmdFirst + 3

die nächste sequentiell zu vergebende ID wäre idCmdFirst + 4, zurückgeben musst du also 4, auch wenn du "idCmdFirst + 2" nicht vergeben hast.

Hallo marabu, jetzt fängt es an, klarer zu werden:

Zitat:

Zitat von Delphi-Hilfe
returns an HRESULT value ... and its code value set to the offset of the largest command identifier that was assigned, plus one.

Bedeutet anders formuliert, den höchsten Wert, den ich zu idCmdFirst hinzuaddiert habe (Offset) erhöhe ich um 1 und habe dann den Rückgabewert, auch wenn Lücken dazwischen sind. (Stimmt das so?)


Zitat:

Zitat von Delphi-Hilfe
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).

Also auch hier (wie in meinem Beispiel oben) wurden insgesamt 4 "Indexe" (Indizes) vergeben:

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 von marabu
Deine ID-Werte musst du aus dem Range idCmdFirst..idCmdLast nehmen

Soweit klar.

Zitat:

Zitat von marabu
Das Delphi-Pendant zum Makro MAKE_HRESULT() heißt MakeResult() und du findest es in der Unit ActiveX.

Auch dafür ein dickes Dankeschön! :hello: Selbst mit eingeschaltetet Ähnlichkeitssuche schweigt sich die (Turbo-)Delphi-Hilfe aus! :evil: Und eine Suche im WWW bringt nur Millionen Treffer für die C++-Variante (die mit dem Unterstrich).

Guido.

marabu 19. Jul 2008 14:19

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.

Guido Eisenbeis 19. Jul 2008 16:47

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