AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Rückgabewert für QueryContextMenu erstellen
Thema durchsuchen
Ansicht
Themen-Optionen

Rückgabewert für QueryContextMenu erstellen

Ein Thema von Guido Eisenbeis · begonnen am 8. Jul 2008 · letzter Beitrag vom 19. Jul 2008
Antwort Antwort
Guido Eisenbeis

Registriert seit: 9. Apr 2006
389 Beiträge
 
Delphi 10.3 Rio
 
#1

Rückgabewert für QueryContextMenu erstellen

  Alt 8. Jul 2008, 14:45
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.
  Mit Zitat antworten Zitat
Guido Eisenbeis

Registriert seit: 9. Apr 2006
389 Beiträge
 
Delphi 10.3 Rio
 
#2

Re: Rückgabewert für QueryContextMenu erstellen

  Alt 18. Jul 2008, 10:18
Hallo, weiß irgendjemand was?
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#3

Re: Rückgabewert für QueryContextMenu erstellen

  Alt 18. Jul 2008, 13:28
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
  Mit Zitat antworten Zitat
Guido Eisenbeis

Registriert seit: 9. Apr 2006
389 Beiträge
 
Delphi 10.3 Rio
 
#4

Re: Rückgabewert für QueryContextMenu erstellen

  Alt 18. Jul 2008, 17:45
Hallo marabu,

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?


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. )

Viele Grüße,
Guido.


Edit: MAKE_HRESULT()-Frage hinzugefügt.
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#5

Re: Rückgabewert für QueryContextMenu erstellen

  Alt 18. Jul 2008, 20:42
Hallo nochmal,

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 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
  Mit Zitat antworten Zitat
Guido Eisenbeis

Registriert seit: 9. Apr 2006
389 Beiträge
 
Delphi 10.3 Rio
 
#6

Re: Rückgabewert für QueryContextMenu erstellen

  Alt 19. Jul 2008, 14:59
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 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 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 von marabu:
Deine ID-Werte musst du aus dem Range idCmdFirst..idCmdLast nehmen
Soweit klar.

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! Selbst mit eingeschaltetet Ähnlichkeitssuche schweigt sich die (Turbo-)Delphi-Hilfe aus! Und eine Suche im WWW bringt nur Millionen Treffer für die C++-Variante (die mit dem Unterstrich).

Guido.
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#7

Re: Rückgabewert für QueryContextMenu erstellen

  Alt 19. Jul 2008, 15:19
Da sehe ich jetzt keine Missverständnisse mehr.

Viel Erfolg mit deinem Projekt und ein schönes Wochenende wünsche ich dir.
  Mit Zitat antworten Zitat
Guido Eisenbeis

Registriert seit: 9. Apr 2006
389 Beiträge
 
Delphi 10.3 Rio
 
#8

Re: Rückgabewert für QueryContextMenu erstellen

  Alt 19. Jul 2008, 17:47
Hallo marabu,

vielen Dank für die Hilfe!

Guido.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:25 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz