![]() |
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: ![]() 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 |
AW: Windows Explorer Shell Extention - mit SubMenu
Mein ExifReader hat eine Shellextzension mit Menü:
![]() ![]() |
AW: Windows Explorer Shell Extention - mit SubMenu
Merci, werde ich mir gleich mal genauer anschauen.
Greetz Data |
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:
Jetzt vermute ich das Ihm die Deklaration der Parameter nicht passt,
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; 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 |
AW: Windows Explorer Shell Extention - mit SubMenu
Delphi-Quellcode:
Hilft Dir das vielleicht weiter ?
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; |
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.
![]() Kostet auch nix. :) |
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 |
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:
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
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; die Commands des ShellPopups durcheimnander geworfen werden. Sieht jemand den Fehler/das Problem ? Greetz Data |
AW: Windows Explorer Shell Extention - mit SubMenu
Du musst für x64 eine andere DLL und wahrscheinlich auch GUID erzeugen. Problem ist
![]() |
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 09:19 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