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
Seite 1 von 2  1 2      
Benutzerbild von DataCool
DataCool

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

Windows Explorer Shell Extention - mit SubMenu

  Alt 19. Sep 2011, 15:30
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
Der Horizont vieler Menschen ist ein Kreis mit Radius Null, und das nennen sie ihren Standpunkt.
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#2

AW: Windows Explorer Shell Extention - mit SubMenu

  Alt 19. Sep 2011, 15:34
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/
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von DataCool
DataCool

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

AW: Windows Explorer Shell Extention - mit SubMenu

  Alt 19. Sep 2011, 16:01
Merci, werde ich mir gleich mal genauer anschauen.

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
 
#4

AW: Windows Explorer Shell Extention - mit SubMenu

  Alt 20. Sep 2011, 10:20
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
Der Horizont vieler Menschen ist ein Kreis mit Radius Null, und das nennen sie ihren Standpunkt.
  Mit Zitat antworten Zitat
Benutzerbild von RWarnecke
RWarnecke

Registriert seit: 31. Dez 2004
Ort: Stuttgart
4.408 Beiträge
 
Delphi XE8 Enterprise
 
#5

AW: Windows Explorer Shell Extention - mit SubMenu

  Alt 20. Sep 2011, 10:30
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 ?
Rolf Warnecke
App4Mission
  Mit Zitat antworten Zitat
Benutzerbild von cookie22
cookie22

Registriert seit: 28. Jun 2006
Ort: Düsseldorf
936 Beiträge
 
Delphi XE2 Professional
 
#6

AW: Windows Explorer Shell Extention - mit SubMenu

  Alt 20. Sep 2011, 11:37
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.
Gruß
Cookie
  Mit Zitat antworten Zitat
Benutzerbild von DataCool
DataCool

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

AW: Windows Explorer Shell Extention - mit SubMenu

  Alt 20. Sep 2011, 13: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
 
#8

AW: Windows Explorer Shell Extention - mit SubMenu

  Alt 26. Sep 2011, 10: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
 
#9

AW: Windows Explorer Shell Extention - mit SubMenu

  Alt 29. Sep 2011, 10: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
 
#10

AW: Windows Explorer Shell Extention - mit SubMenu

  Alt 29. Sep 2011, 10: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
Antwort Antwort
Seite 1 von 2  1 2      


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 04:20 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