Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi ShellExt Problem (https://www.delphipraxis.net/174888-shellext-problem.html)

Bambuti2000 16. Mai 2013 12:23

ShellExt Problem
 
Hi Leuts,

ich weiß, ShellExt sind schon oft und lange breit getreten worden, aber denn noch möchte ich mein Problem hier einstellen.

Ich benötige ein Context-Menü-Erweiterung mit 4 Untermenüs. Über diese Untermenüs rufe ich ein Programm auf und übergebe zusätzlich zum Dateiname der ausgewählten Datei den ItemIndex. Eigentlich soweit kein Problem, ABER jetzt verhält sich das Ganze so, das die ersten 3 einwandfrei funktionieren, und der 4.te Eintrag immer "Microsoft Security Essentials" aufruft und die gewählte Datei dann scannt. Ist zwar auch ganz hübsch, ist aber nicht ganz das was ich wollte. Zufälliger Weise ist der "Microsoft Security Essentials" Eintrag im Context-Menü direkt über dem meinigen.

Wenn jemand meinen Fehler findet und mir helfen könnte wäre ich sehr dankbar.

Hier mein QueryContextMenu:
Delphi-Quellcode:
function TListFilesContextMenu.QueryContextMenu(Menu: HMENU;
  indexMenu, idCmdFirst, idCmdLast, uFlags: UINT): HResult;
var
  ListMenuItem: TMenuItemInfo;
  MenuCaption: String;
  SubMenu: HMENU;
  uId: UINT;
begin
  Result := MakeResult(SEVERITY_SUCCESS, 0, 3);

  FMenuItemIndex := indexMenu;

  if (uFlags and CMF_EXPLORE) = CMF_EXPLORE then
    MenuCaption := 'Datei-/Verzeichnisliste drucken'
  else
    Result := E_FAIL;

  if Result <> E_FAIL then
  begin
    SubMenu := CreatePopupMenu;

    idFirst := idCmdFirst;
    idLast := idCmdLast;

    uId := idCmdFirst;
    InsertMenu(SubMenu, 0, MF_BYPOSITION, uID, PWideChar('Dateien'));
    Inc(uId);
    InsertMenu(SubMenu, 1, MF_BYPOSITION, uId, PWideChar('Dateien und Verzeichnisse'));
    Inc(uId);
    InsertMenu(SubMenu, 2, MF_BYPOSITION, uId, PWideChar('Dateien (rekursiv)'));
    Inc(uId);
    InsertMenu(SubMenu, 3, MF_BYPOSITION, uId, PWideChar('Dateien und Verzeichnisse (rekursiv)'));

    FillChar(ListMenuItem, SizeOf(TMenuItemInfo), #0);
    ListMenuItem.cbSize := SizeOf(TMenuItemInfo);
    ListMenuItem.fMask := MIIM_SUBMENU or MIIM_STRING or MIIM_ID;
    ListMenuItem.fType := MFT_STRING;
    ListMenuItem.wID := FMenuItemIndex;
    ListMenuItem.hSubMenu := SubMenu;
    ListMenuItem.dwTypeData := PWideChar(MenuCaption);
    ListMenuItem.cch := Length(MenuCaption);

    InsertMenuItem(Menu, indexMenu, True, ListMenuItem);
    try
      hBmp.LoadFromFile(GetFileListIcon);
      SetMenuItemBitmaps(Menu, indexMenu, MF_BYPOSITION, hBmp.Handle, hBmp.Handle);
    except

    end;
  end;
end;
By the way, wenn noch einer eine Idee hat wie ich das Bitmap Transparent darstellen kann (mit Mask bekomme ich nur noch schwarze Symbole angezeigt), würde ich nicht enttäuscht sein. ;-)

Dank Euch

Stefan

PS: Da fällt mir noch was ein... OS=Win7 64Bit, und noch ein Problem, sobald die DLL registriert ist/war, wird Sie vom Explorer nicht mehr frei gegeben. Das heißt, ich muss den Task abschießen, damit ich die DLL neu kompilieren kann.

Bambuti2000 21. Mai 2013 10:30

AW: ShellExt Problem
 
Hi, gibt's denn niemanden der ein ähnliches Problem hat oder der eine Idee hat wie man dieses hier beheben kann? Schade! :cry:

Gruß
Stefan

baumina 21. Mai 2013 10:37

AW: ShellExt Problem
 
Ich versteh schlichtweg nicht was du wissen magst.

Bernhard Geyer 21. Mai 2013 10:43

AW: ShellExt Problem
 
Zitat:

Zitat von Bambuti2000 (Beitrag 1215526)
PS: Da fällt mir noch was ein... OS=Win7 64Bit, und noch ein Problem, sobald die DLL registriert ist/war, wird Sie vom Explorer nicht mehr frei gegeben. Das heißt, ich muss den Task abschießen, damit ich die DLL neu kompilieren kann.

As Designed. Wie sollte es den der Windows Explorer anders performant machen?

Bambuti2000 21. Mai 2013 11:38

AW: ShellExt Problem
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Ich versteh schlichtweg nicht was du wissen magst.
OK,
dann sag doch was.
Ich hab mal einen PrintScreen gemacht. Alles funktioniert so wie es soll, nur der letzte Menüeintrag (rot markiert) ruft immer "Microsoft Security Essentials" auf.

Gruß
Stefan

CCRDude 21. Mai 2013 12:50

AW: ShellExt Problem
 
Einen konkreten Fehler sehe ich nicht, wohl aber was ich anders mache (und bei mir funktionieren drei Untermenüeinträge): ich weise meinem ListMenuItem.wID die nächste Nummer (bei dir uId+1) zu und nicht etwa indexMenu. Du mischt da so wie Du das machst Position und ID.

Bambuti2000 21. Mai 2013 21:10

AW: ShellExt Problem
 
Zitat:

Einen konkreten Fehler sehe ich nicht, wohl aber was ich anders mache (und bei mir funktionieren drei Untermenüeinträge): ich weise meinem ListMenuItem.wID die nächste Nummer (bei dir uId+1) zu und nicht etwa indexMenu. Du mischt da so wie Du das machst Position und ID.
Also, ich hab das jetzt mal geändert und getestet, aber leider tut sich da nix. Kannst du evtl. mal bei dir 1-2 Untermenü-Einträge mehr erstellen und testen ob da ein ähnliches Phänomen zu verzeichnen ist?

Gruß
Stefan

CCRDude 22. Mai 2013 07:13

AW: ShellExt Problem
 
Vorab ein Tipp zum Debuggen unter Win64: man nehme einen Total Commander in der 32-Bit-Version und kompiliere die Extension für 32 Bit. Sobald man den wieder zumacht, ist die DLL dann auch wieder "frei" (evtl. stellt man auch in der Registry noch ein, dass DLLs nicht im Cache gehalten werden sollen, hab die Stelle gerade nicht auswendig parat).

Abhängig von den Dateien im Projektordner habe ich bis zu vier Einträge. Habe also die vierte reingelegt - auch die klappt einwandfrei.

Wie wäre es, wenn Du uns auch Dein InvokeCommand zeigst?

Aber ich darf Dir auch nochmal einen wichtigen Teil der Doku zitieren:
Zitat:


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.
Du gehst leider davon aus, dass idCmdFirst immer 0 ist, und hast bei Deinem MakeResult den +1-Offset (und evtl. das Menü selber) vergessen.

Bambuti2000 22. Mai 2013 11:50

AW: ShellExt Problem
 
Zitat:

Du gehst leider davon aus, dass idCmdFirst immer 0 ist, und hast bei Deinem MakeResult den +1-Offset (und evtl. das Menü selber) vergessen.
Das war genau der richtige Tip !!! DANKE
Ich hab den Offset vergessen.
Aber ich weiß leider nicht wie du darauf kommst das ich von idCmdFirst = 0 ausgehe.
Hab ich noch einen Fehler?

Gruß
Stefan


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:45 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