Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Windows Explorer Shell Extention - mit SubMenu (https://www.delphipraxis.net/163201-windows-explorer-shell-extention-mit-submenu.html)

DataCool 19. Sep 2011 14:30

Windows Explorer Shell Extention - mit SubMenu
 
Hallo zusammen,

ich möchte gerne eine Erweiterung für das Popup-Menu des Windows-Explorer schreiben,
dazu habe ich auch schon die ein oder andere Sache im Netz gefunden.
Allerdings benötige ich nicht nur einen "einfachen" Eintrag im Popup-Menu,
sondern einen Eintrag mit diversen Submenus und dazu habe ich bis jetzt noch keinen
Ansatz gefunden.

Ich bin auch bereit ein paar Euros zu investieren, wenn ich dafür das Rand nicht neu erfinden muss.
Auf der Suche nach fertigen Lösungen/Komponenten bin ich auf folgendes Angebot gestossen:

http://www.shellplus.com/

Scheinbar alles was ich gesucht habe + ein paar nette Funktionen mehr, allerdings war es mir nicht möglich die
Demo-Version runterzuladen(erhalte immer nur ein 2 KB Zip was als ungültig tituliert wird).
Des Weiteren ist die letzte Version von 2008 für Delphi 2007, somit ist habe ich
keine Ahnung ob das ganze auch unter XE / XE2(später) läuft.

Hat jemand schon Erfahrungen mit den Komponenten ?

Weiß jemand für mich alternative Komponenten mit denen ich mein Vorhaben realisieren kann ?

Oder hat jemand für mich einen Ansatz wie ich das ganze selber realisieren kann ?

Vielen Dank im vorraus,

Greetz Data

Luckie 19. Sep 2011 14:34

AW: Windows Explorer Shell Extention - mit SubMenu
 
Mein ExifReader hat eine Shellextzension mit Menü: http://www.michael-puff.de/Programmi...lphi/Programme -> ExifReader.zip Zusammen mit dem Kapitel über Menüs aus der WinAPI in meinem WinAPI Tutorial solltest du auch Submenüs hinbekommen: http://www.michael-puff.de/Programmi...phi/Tutorials/

DataCool 19. Sep 2011 15:01

AW: Windows Explorer Shell Extention - mit SubMenu
 
Merci, werde ich mir gleich mal genauer anschauen.

Greetz Data

DataCool 20. Sep 2011 09:20

AW: Windows Explorer Shell Extention - mit SubMenu
 
Moin Moin,

bin leider auf das nächste Problem gestossen:

Luckie's Programm habe ich mir angesehen und weiß jetzt auch wie ich das hinbekomme was ich möchte.
Allerdings schaffe ich es nicht die Shell-Extention für Windows x64 zu kompilieren.

Momentan habe ich von XE2 nur die Testversion und die meckert mir beim compilieren,
egal ob Zielplatform 32 oder 64 Bit folgendes an :
"[DCC Fehler] Unit1.pas(33): E2291 Implementierung der Interface-Methode IContextMenu.GetCommandString fehlt"


Delphi-Quellcode:
type
  TXYZShellExt = class(TComObject, IShellExtInit, IContextmenu)
  private
    FFilename: array[0..MAX_PATH] of Char;
  protected
    function IShellExtInit.Initialize = SEInitialize;
    function SEInitialize(pidlFolder: PItemIDList; lpdobj: IDataObject;
      hKeyProgID: HKEY): HResult; stdcall;
    function QueryContextMenu(Menu: HMENU; indexMenu, idCmdFirst, idCmdLast,
      uflags: UINT): HResult; stdcall;
    function InvokeCommand(var lpici: TCMInvokeCommandInfo): HResult; stdcall;
    function GetCommandString(idCmd, uType: UINT; pwReserved: PUINT; pszName:
      LPSTR; cchMax: UINT): HResult; stdcall;
  end;

// .....

implementation


function TXYZShellExt.GetCommandString(idCmd, uType: UINT; pwReserved: PUINT;
  pszName: LPSTR; cchMax: UINT): HResult;
begin
  // egal
end;
Jetzt vermute ich das Ihm die Deklaration der Parameter nicht passt,
da ich wie schon erwähnt momentan nur die Testversion von XE2 habe.
Ist es mir nicht möglich in die Unit "WinApi.ShlObj.pas" zu schauen,
wie bei iContextMenu die function GetCommandString exakt deklariert ist.

Ist es jemanden möglich den Header hier zu posten ?

Oder weiß jemand aus dem Stehgreif wo mein Problem liegt ?

Danke im vorraus,

Greetz Data

RWarnecke 20. Sep 2011 09:30

AW: Windows Explorer Shell Extention - mit SubMenu
 
Delphi-Quellcode:
  IContextMenu = interface(IUnknown)
    [SID_IContextMenu]
    function QueryContextMenu(Menu: HMENU;
      indexMenu, idCmdFirst, idCmdLast, uFlags: UINT): HResult; stdcall;
    function InvokeCommand(var lpici: TCMInvokeCommandInfo): HResult; stdcall;
    function GetCommandString(idCmd: UINT_PTR; uFlags: UINT; pwReserved: PUINT;
      pszName: LPSTR; cchMax: UINT): HResult; stdcall;
  end;
Hilft Dir das vielleicht weiter ?

cookie22 20. Sep 2011 10:37

AW: Windows Explorer Shell Extention - mit SubMenu
 
Schau dir mal die Drag&Drop Components von Anders Melander an. Da sind auch Kompos für Shell Extensions dabei.

http://melander.dk/

Kostet auch nix. :)

DataCool 20. Sep 2011 12:12

AW: Windows Explorer Shell Extention - mit SubMenu
 
@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

DataCool 26. Sep 2011 09:26

AW: Windows Explorer Shell Extention - mit SubMenu
 
@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 :roll:

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

Union 29. Sep 2011 09:21

AW: Windows Explorer Shell Extention - mit SubMenu
 
Du musst für x64 eine andere DLL und wahrscheinlich auch GUID erzeugen. Problem ist bekannt.

CCRDude 29. Sep 2011 09:29

AW: Windows Explorer Shell Extention - mit SubMenu
 
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 ;)


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:34 Uhr.
Seite 1 von 2  1 2      

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