AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Windows Explorer Shell Extention - mit SubMenu
Thema durchsuchen
Ansicht
Themen-Optionen

Windows Explorer Shell Extention - mit SubMenu

Ein Thema von DataCool · begonnen am 19. Sep 2011 · letzter Beitrag vom 29. Sep 2011
Antwort Antwort
Benutzerbild von DataCool
DataCool

Registriert seit: 10. Feb 2003
Ort: Lingen
909 Beiträge
 
Delphi 10.3 Rio
 
#1

AW: Windows Explorer Shell Extention - mit SubMenu

  Alt 20. Sep 2011, 12:12
@RWarnecke:
Auch Dir vielen Dank, damit kann ich jetzt auch unter XE2 compilieren.

@cookie22:
Danke für den Tipp, denke aber damit werde ich Trouble unter XE2 für 64Bit haben.


Denke ich werde das ganze jetzt in guter "Deutscher" Handarbeit machen

Greetz Data
Der Horizont vieler Menschen ist ein Kreis mit Radius Null, und das nennen sie ihren Standpunkt.
  Mit Zitat antworten Zitat
Benutzerbild von DataCool
DataCool

Registriert seit: 10. Feb 2003
Ort: Lingen
909 Beiträge
 
Delphi 10.3 Rio
 
#2

AW: Windows Explorer Shell Extention - mit SubMenu

  Alt 26. Sep 2011, 09:26
@All:
Nachdem ich kurzfristig etwas anderes erledigen mußte, bin ich jetzt wieder bei dieser Geschichte angekommen.
DAs Projekt kompiliert ohne Fehler unter XE2, auch für x64.
Es lässt sich auch unter X64 einwandfrei installieren/deinstallieren.

Wenn ich nur einen Menueintrag erzeuge klappt das ganze auch 100%.

Versuche ich allerdings in der function QueryContextMenu mehrere Einträge inkl. Submenus
zu erzeugen, dann kommen die Events nicht immer in function "InvokeCommand" an,
teilweise abhängig von der Dateiendung wird InvokeCommand gar nicht ausgelöst,
sondern andere System Dialogs gehen auf, z.B. auf der eigenen DLL geht ein erweitertes
Eigenschaft Fenster auf. Bei einer anderen Datei passiert gar nichts.
Bei wieder einer anderen Datei kommt der Klick in InvokeCommand an,
wahrscheinlichkeit allerdings so 1:15

Hier mein Code:
Delphi-Quellcode:
function TDemoSCPE.QueryContextMenu (Menu: HMENU;
                      indexMenu, idCmdFirst, idCmdLast, uFlags: UINT) : HResult;
const
  cMenuText = 'MyContextMenu';
var iCode : Integer;
  hMnu: HMENU;
  hMnu2: HMENU;
  //vReg: TRegistry;
  Idx: Integer;
  mii: TMenuItemInfo;

begin
  Result := 0;
  uMenuID := indexMenu;

  if ((uFlags and $0000000F) = CMF_NORMAL) or
     ((uFlags and CMF_EXPLORE) <> 0) then begin

    (*
    CreateMenu (cMenuText);  // <-- sub-Procedure die ein MenuItem erstellt
    result := 1;
    *)

    // ^^ obriger Code mit nur einem MenuItem funktioniert einwandfrei

    // Ich versuche allerdings eine Menu-Struktur aufzubauen die in etwa so aussieht:
    // MeinKontextMenü - Hauptmenüeintrag (kein Index) - kann keine Aktion auslösen
    // Menüpunkt 1 - Index 0
    // Menüpunkt 2 - Index 1
    // Menüpunkt 4 - hier kommt ein weiteres Untermenü (Index 2 - kann aber keine Aktion auslösen)
    // Untermenü - Index 3


    hMnu := CreatePopupMenu();
    AppendMenu(hMnu, MF_STRING, idCmdFirst, 'Menüpunkt 1');
    AppendMenu(hMnu, MF_STRING, idCmdFirst + 1, 'Menüpunkt 2');

    // Untermenü erzeugen - dies hat dann den "virtuellen" Index von 2
    hMnu2 := CreatePopupMenu();
    // das ist der dritte Menüpunkt
    AppendMenu(hMnu2, MF_STRING, idCmdFirst + 3, 'Untermenü');

    // Das Untermenü erhält den Text Menüpunkt 4
    mii.cbSize := sizeof(TMenuItemInfo);
    mii.fMask := MIIM_SUBMENU or MIIM_STRING or MIIM_ID;
    mii.wID := idCmdFirst + 2;
    mii.hSubMenu := hMnu2;
    mii.dwTypeData := PChar('Untermenü');
    InsertMenu(hMnu, idCmdFirst + 2, MF_STRING or MF_BYPOSITION or MF_POPUP, hMnu2, 'Menüpunkt 4'); // 2

    mii.cbSize := sizeof(TMenuItemInfo);
    mii.fMask := MIIM_SUBMENU or MIIM_STRING or MIIM_ID;
    mii.wID := idCmdFirst + 4;
    mii.hSubMenu := hMnu;
    mii.dwTypeData := PChar(cMenuText);

    // die folgenden Anweisungen sind wichtig, damit das Bild korrekt erscheint.
    InsertMenuItem(Menu, indexMenu, True, mii);

    (* für das Problem nicht relevant
    if hBmp.Handle <> 0 then
      SetMenuItemBitmaps(Menu, indexMenu, MF_BYPOSITION, hBmp.Handle, hBmp.Handle);
    *)


    // Result := 4 // Anzahl der zusätzlichen Menüpunkte
    //
    iCode := idCmdFirst+4 - idCmdFirst +1;
    Result := MakeResult (SEVERITY_SUCCESS, 0, iCode);
  end; // if

  (* orginal MSDN Hilfe :

    Return value

    Type: HRESULT

    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, if 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 a COM error value.
  *)

end;
Ich vermute das ich entweder mein Menu falsch aufbaue(Struktur wird allerdings im Explorerpopup komplett richtig dargestellt) oder das mein Result was ich zurück liefere nicht stimmt und somit
die Commands des ShellPopups durcheimnander geworfen werden.

Sieht jemand den Fehler/das Problem ?

Greetz Data
Der Horizont vieler Menschen ist ein Kreis mit Radius Null, und das nennen sie ihren Standpunkt.
  Mit Zitat antworten Zitat
Benutzerbild von Union
Union

Registriert seit: 18. Mär 2004
Ort: Luxembourg
3.492 Beiträge
 
Delphi 7 Enterprise
 
#3

AW: Windows Explorer Shell Extention - mit SubMenu

  Alt 29. Sep 2011, 09:21
Du musst für x64 eine andere DLL und wahrscheinlich auch GUID erzeugen. Problem ist bekannt.
Ibi fas ubi proxima merces
sudo /Developer/Library/uninstall-devtools --mode=all
  Mit Zitat antworten Zitat
CCRDude

Registriert seit: 9. Jun 2011
678 Beiträge
 
FreePascal / Lazarus
 
#4

AW: Windows Explorer Shell Extention - mit SubMenu

  Alt 29. Sep 2011, 09:29
Also aus eigener Erfahrung: GUID kann dieselbe sein. Die eine wird ja unter HKLM\SOFTWARE\Classes\ registriert, die andere unter HKLM\SOFTWARE\Wow6432Node\Classes\.

In meinem Fall kompiliere ich die MyExtension32.dpr mit Delphi XE und MyExtension64.pas mit FreePascal (64 bit).

Das Argument des doppelt gepflegten Codes kann ich nicht ganz nachvollziehen - außer einem uses und 4 Exporten steht in den beiden genannten Dateien eh nichts drin, und beide verwenden dieselbe UnitMyExtension.pas.

Aber auch wenn man mit derselben Datei in Delphi XE2 beide Konfigurationen kompilieren würde, würden sie ja in unterschiedlichen Ordnern landen, und das Post Build Script oder aber entsprechende weiterführende Build Tools übernähmen das Verschieben und Umbenennen.

Aber: das hört sich nicht wirklich an, als hätte es etwas mit dem Problem zu tun
  Mit Zitat antworten Zitat
Benutzerbild von DataCool
DataCool

Registriert seit: 10. Feb 2003
Ort: Lingen
909 Beiträge
 
Delphi 10.3 Rio
 
#5

AW: Windows Explorer Shell Extention - mit SubMenu

  Alt 29. Sep 2011, 09:34
@Union:
Danke für den Tipp, aber das Problem habe ich wie folgt umschifft:
Delphi-Quellcode:
const
{$IFDEF WIN32}
    cClassName = 'ABCDEFG-SCPE';
    Class_ContextMenu : TGUID = '{1A37D77A-XXXX-YYYY-ZZZZ-ED810D289574}';
{$ELSE}
    cClassName = 'ABCDEFG-SCPE64';
    Class_ContextMenu : TGUID = '{1A37D77A-XXXX-YYYY-ZZZZ-ED810D289575}';
{$ENDIF}
Eigentlich scheint es unter x64 jetzt auch mit allen Files & Folder zu klappen,
nur wenn ich einen meiner Menüpunkte auf einer "Verknüpfung zur Konsole" anwende
bekomme ich noch das vorher beschriebe komische Verhalten, bin aber sehr optimistisch
das ich das noch in den Griff bekomme.

Registriert ist Extention übrings für "*" und "Folder".

Bin aber für jeden weiteren Tipp dankbar ;-9

Greetz Data
Der Horizont vieler Menschen ist ein Kreis mit Radius Null, und das nennen sie ihren Standpunkt.
  Mit Zitat antworten Zitat
CCRDude

Registriert seit: 9. Jun 2011
678 Beiträge
 
FreePascal / Lazarus
 
#6

AW: Windows Explorer Shell Extention - mit SubMenu

  Alt 29. Sep 2011, 10:21
Shortcuts kannst Du per uFlags and CMF_VERBSONLY überprüfen.
  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 14:40 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