Autor Beitrag
JayEff
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2971

Windows Vista Ultimate
D7 Enterprise
BeitragVerfasst: Sa 23.06.07 20:09 
Hallo Leute!
Ich hab mal eine ShellExtention registriert. Was das ist, sieht man hier:
*der screenshot is mir verloren gegangen :oops: *
Wie das geht, das ist recht einfach:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
        succes := true;
        reg.RootKey := HKEY_CLASSES_ROOT;
        If Not reg.OpenKey('*\shell\EncodedSFX', true) Then //EncodedSFX wird als Schlüssel erstellt
            succes := false;
        reg.WriteString('', 'Mit Passwort schützen'); //Anzeige im Rechtsklick-Menü
        If Not reg.OpenKey('command', true) Then //EncodedSFX/Command enthält Pfad&Application.exe
            succes := false;
        reg.WriteString('', '"' + Application.ExeName + '" "%1"'); //dito
        If succes Then
            Showmessage('ShellExtention erfolgreich registriert')
        Else
            showmessage(ErrorIDToString(GetLastError));

Was mich nun interessiert, wäre: Wie kann ich ein Symbol vor die Anzeige packen, wie das z.B. WinZip macht? Es gibt noch andere stellen in der Registry, die diese Funktion erfüllen, da wird aber nur irgendeine Zeichenkette gespeichert, so macht das auch WinZip. Was die bedeutet, weiß ich nicht und konnte ich auch nicht finden.
Wenn das als unmöglich erklärt wird ( :shock: ) oder eine Lösung gefunden wird, dann würd ich das auch in die Library posten ... ;)

_________________
>+++[>+++[>++++++++<-]<-]<++++[>++++[>>>+++++++<<<-]<-]<<++
[>++[>++[>>++++<<-]<-]<-]>>>>>++++++++++++++++++.+++++++.>++.-.<<.>>--.<+++++..<+.


Zuletzt bearbeitet von JayEff am Sa 04.04.09 16:39, insgesamt 1-mal bearbeitet
_frank_
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 343
Erhaltene Danke: 1

Win XP
Delphi 3 Prof / Turbo Delphi Explorer
BeitragVerfasst: So 24.06.07 05:03 
du hast mit dem Code keine Shellextension registriert, sondern lediglich das Kontextmenü erweitert ;)
eine richtige Shellextension (wo man auch ein Icon definieren kann) benötigt eine dll, die man mittels RegSvr32 registrieren muss.
wie man eine solche DLL erstellt steht u.a. hier:
www.del-net.com/delphi/topic10.html

HTH Frank

_________________
EB FE (die wahrscheinlich kürzeste Endlosschleife der Welt :) )
BA 01 00 00 00 52 EB 09 BB 4D 11 86 7C FF D3 EB 0D E8 F2 FF FF FF 63 68 61 72 6D 61 70 00 C3
JayEff Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2971

Windows Vista Ultimate
D7 Enterprise
BeitragVerfasst: So 24.06.07 16:02 
Keine ShellEx, wa? Egal! Es hat die funktion, drum fand ich, das passt :) Nun werd ich deinen Link versuchen, vielen Dank schonmal!

_________________
>+++[>+++[>++++++++<-]<-]<++++[>++++[>>>+++++++<<<-]<-]<<++
[>++[>++[>>++++<<-]<-]<-]>>>>>++++++++++++++++++.+++++++.>++.-.<<.>>--.<+++++..<+.
JayEff Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2971

Windows Vista Ultimate
D7 Enterprise
BeitragVerfasst: So 24.06.07 17:21 
Ich bin zu folgender Schlussfolgerung gekommen:
Ich habe absolut keine Ahnung, wie ich mit dem Code in deinem Link umgehen muss.
Folge ich genauestens den Anweisungen, bekomme ich eine ShellExtention mit meinem Symbol und dem vorgefertigten Menü, welches aber nur für Ordner, nicht für Dateien angezeigt wird :shock: (Und das, obwohl ich nichts verändert hab: Das Menü wird immernoch sowohl unter Folder\shellex\ als auch *\shellex\ registriert). Bis hierher und nicht weiter komme ich. Alles was ich will, ist EIN Punkt, OHNE Untermenü mit genau EINER Funktionalität, nämlich die markierten Dateien an mein Programm weitergeben, in jeder beliebigen Form, das Programm kann beliebig viele Parameter bearbeiten :cry:
Würdest du dich vielleicht erbarmen, mir den Code dementsprechend anzupassen oder mir genauer zu erklären, wie ich den Code anzupassen habe?
Ich verstehe ja, dass ich die Menüstruktur hier verändern kann:
ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
function TDFKontextMenuShellExt.QueryContextMenu(Menu: HMENU; indexMenu,
  idCmdFirst, idCmdLast, uflags: UINT): HResult;
var
  hMnu: HMENU;
  hMnu2: HMENU;
  vReg: TRegistry;
  Idx: Integer;
  mii: TMenuItemInfo;
begin
  if ((uFlags and $0000000F) = CMF_NORMAL) or ((uFlags and CMF_EXPLORE) <> 0) or
     ((uFlags and CMF_VERBSONLY) <> 0) then // VERBS -- auch für Desktop-Icons
  begin
    // ffg. Menüstruktur soll erzeugt werden =>
    // DFKontextMenü   - Hauptmenüeintrag (kein Index) - kann keine Aktion auslösen
    //   Menüpunkt 1   - Index 0
    //   Menüpunkt 2   - Index 1
    //   Menüpunkt 4   - 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 := PAnsiChar('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 := PAnsiChar('DF KontextMenü');

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

    if hBmp.Handle <> 0 then
      SetMenuItemBitmaps(Menu, indexMenu, MF_BYPOSITION, hBmp.Handle, hBmp.Handle);

    Result := 4 // Anzahl der zusätzlichen Menüpunkte
  end
  else
    Result := 0;
end;

Aber alles, was ich bisher getan hab, war die Beschriftungen verändern, was ja auch klappt :roll: Nur alle weiteren Experimente führen z.B. zum Absturz des Explorers, dazu, dass "Dateien mit Antivir prüfen" mein Symbol bekommt oder gar "Öffnen mit..." mit meinem Symbol verschönert wird.

Interessanterweise lässt sich die dll nach dem deregistrieren *nicht* löschen. Erst nachdem ich das Explorer-Fenster, welches ihren Ordner anzeigt, geschlossen und wieder geöffnet habe, kann ich sie Löschen bzw. überschreiben.

Ich hoffe, dass du mir da helfen kannst ... es ist echt ärgerlich, dass ich das nicht kapieren kann ...

Edit: Habe nun eingebaut, dass die ShowMessage sämtliche FFileName anzeigt, die in TDFKontextMenuShellExt.SEInitialize in der Schleife in eine StringList geschrieben werden. Habe bemerkt, dass bei Rechtsklick auf exe-Dateien das Kontextmenü angezeigt wird (also nicht nur bei Ordnern :roll: ). Hierbei gibt die Showmessage dann den gesammten Ordnerinhalt aus, jede Datei darin. Bei Rechtsklick auf einen Ordner wird nur der Pfad des Ordners ausgegeben. :shock:

_________________
>+++[>+++[>++++++++<-]<-]<++++[>++++[>>>+++++++<<<-]<-]<<++
[>++[>++[>>++++<<-]<-]<-]>>>>>++++++++++++++++++.+++++++.>++.-.<<.>>--.<+++++..<+.
_frank_
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 343
Erhaltene Danke: 1

Win XP
Delphi 3 Prof / Turbo Delphi Explorer
BeitragVerfasst: So 24.06.07 21:39 
also ich hab das selber noch nicht gemacht...kann dir da nicht allzu viel mehr sagen...

imho funktioniert das folgendermaßen:

ne eigene classid hast du erzeugt (Strg+Umschalt+G) und in der dll verankert?

du musst den reg.eintrag unter
HKCR\Folder\ShellEx\ContextMenuHandler
eintragen (als ClassID-schlüssel {...})
diese ClassID muss unter
HKCR\CLSID
einen eigenen Schlüssel haben, wo diese mit der dll verknüpft wird, dll registrieren hast du schon gemacht...kannst dir den zusammenhang ja auch mit der winzip-extension mal anschauen zum vergleich

würde das ganze in der VMWare testen, da störts dich nicht, wenn du immer mal nach dem deregistrieren den explorer-prozess killst :)

HTH Frank

_________________
EB FE (die wahrscheinlich kürzeste Endlosschleife der Welt :) )
BA 01 00 00 00 52 EB 09 BB 4D 11 86 7C FF D3 EB 0D E8 F2 FF FF FF 63 68 61 72 6D 61 70 00 C3
JayEff Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2971

Windows Vista Ultimate
D7 Enterprise
BeitragVerfasst: Mo 25.06.07 00:10 
user profile icon_frank_ hat folgendes geschrieben:
also ich hab das selber noch nicht gemacht...kann dir da nicht allzu viel mehr sagen...

imho funktioniert das folgendermaßen:

ne eigene classid hast du erzeugt (Strg+Umschalt+G) und in der dll verankert?

du musst den reg.eintrag unter
HKCR\Folder\ShellEx\ContextMenuHandler
eintragen (als ClassID-schlüssel {...})
diese ClassID muss unter
HKCR\CLSID
einen eigenen Schlüssel haben, wo diese mit der dll verknüpft wird, dll registrieren hast du schon gemacht...kannst dir den zusammenhang ja auch mit der winzip-extension mal anschauen zum vergleich

würde das ganze in der VMWare testen, da störts dich nicht, wenn du immer mal nach dem deregistrieren den explorer-prozess killst :)

HTH Frank

Du verstehst was falsch... Ich hab keine Probleme damit, ein Menü zu registrieren, es geht mir darum, dass ich den Code nicht so verändern kann, dass ich nur einen Eintrag mit einer einzigen Funktion bekomme. Schwachsinniger Weise funktioniert's augenblicklich nur bei Exe-Dateien und Ordnern, bei denen wird das Menü im Rechtsklick angezeigt, bei anderen Dateien nicht.
Ich hab ein Beispiel angehängt, in den Batdateien einfach den Pfad eintragen. Nach dem deregistrieren muss man den Ordner schließen, in der die dll ist, bevor man sie löschen kann.
Bin gespannt, ob's bei euch besser klappt als bei mir ... :( Falls irgendjemand mehr Plan von der Sache hat als ich, wärs wirklich toll, wenn er hier eine kleine Erklärung oder ein bisschen Code posten würde, aber so wie's aussieht, ist's mir der Aufwand nicht wert. Ich will für mein Programm nur ein Symbol vor den Kontextmenüeintrag haben und dafür einen Service zu registrieren, der auch noch unkomfortabel zu entfernen ist, eine DLL zu schreiben durch die ich in 100 Jahren nicht durchblicken werd und auch noch bei jedem neuen Experiment den Ordner öffnen und schließen muss, nur um die blöde DLL zu löschen (Delphi kann sie ja auch nicht überschreiben :autsch: ), das ist's mir nicht wert ;)
Einloggen, um Attachments anzusehen!
_________________
>+++[>+++[>++++++++<-]<-]<++++[>++++[>>>+++++++<<<-]<-]<<++
[>++[>++[>>++++<<-]<-]<-]>>>>>++++++++++++++++++.+++++++.>++.-.<<.>>--.<+++++..<+.
_frank_
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 343
Erhaltene Danke: 1

Win XP
Delphi 3 Prof / Turbo Delphi Explorer
BeitragVerfasst: Mo 25.06.07 01:57 
also bei mir zeigt er das menü nur bei c: an, weder bei unterordnern noch bei exe-dateien (bei bmp z.B. funktioniert es).
weiterhin ist kein untermenü in dem "(Zeigt irgendwelche Dateien an)" eintrag. der letzte eintrag hat ein untermenü, wo aber auch nur 1 "brauch ich nicht"-Eintrag drinsteht.
aber das mit dem Icon hast du wohl hinbekommen ;)

evtl. hast du noch rester von alten Versuchen ;)

hab auch mal die erste if-abfrage auskommentiert (falls die flag-abfrage nicht hinhaut), ohne erfolg...finde auch sonst keinen fehler der eine solche komische Auswahl bewirken könnte.

Hoffe, es finden sich auch noch Tester, die sich damit auskennen, würde mich auch interessieren ;)

Gruß Frank

_________________
EB FE (die wahrscheinlich kürzeste Endlosschleife der Welt :) )
BA 01 00 00 00 52 EB 09 BB 4D 11 86 7C FF D3 EB 0D E8 F2 FF FF FF 63 68 61 72 6D 61 70 00 C3
JayEff Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2971

Windows Vista Ultimate
D7 Enterprise
BeitragVerfasst: Mo 25.06.07 13:53 
user profile icon_frank_ hat folgendes geschrieben:
weiterhin ist kein untermenü in dem "(Zeigt irgendwelche Dateien an)" eintrag. der letzte eintrag hat ein untermenü, wo aber auch nur 1 "brauch ich nicht"-Eintrag drinsteht.

Wie gesagt, ausser den Beschriftungen hab ich alles original gelassen. Klickt man auf "Zeigt irgendwelche Dateien an", zeigt er... nun, alle Dateien in der Stringlist an... :(
Aber gut, wie gesagt, hoffen wir, dass es noch mehr Leute hier gibt, die sich besser auskennen ;)

_________________
>+++[>+++[>++++++++<-]<-]<++++[>++++[>>>+++++++<<<-]<-]<<++
[>++[>++[>>++++<<-]<-]<-]>>>>>++++++++++++++++++.+++++++.>++.-.<<.>>--.<+++++..<+.
_frank_
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 343
Erhaltene Danke: 1

Win XP
Delphi 3 Prof / Turbo Delphi Explorer
BeitragVerfasst: Mo 25.06.07 17:40 
also ich hab das Beispiel aus meinem Buch mal auf das Wesentliche beschränkt.
Ich hoffe, es hilft dir weiter zu kommen

ist mit untermenü, bitmap und zeigt beim klick auf den untermenüeintrag alle markierten Dateien an...war doch so gewollt, oder?

Gruß Frank
Einloggen, um Attachments anzusehen!
_________________
EB FE (die wahrscheinlich kürzeste Endlosschleife der Welt :) )
BA 01 00 00 00 52 EB 09 BB 4D 11 86 7C FF D3 EB 0D E8 F2 FF FF FF 63 68 61 72 6D 61 70 00 C3
JayEff Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2971

Windows Vista Ultimate
D7 Enterprise
BeitragVerfasst: Mo 25.06.07 18:06 
Ich wollte eigentlich *kein* Untermenü, aber danke ich schau's mir an ;)
Die anderen Posts resultieren aus einem Safari Bug und sollten gleich wieder nach Hause gehn ... :/

_________________
>+++[>+++[>++++++++<-]<-]<++++[>++++[>>>+++++++<<<-]<-]<<++
[>++[>++[>>++++<<-]<-]<-]>>>>>++++++++++++++++++.+++++++.>++.-.<<.>>--.<+++++..<+.
_frank_
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 343
Erhaltene Danke: 1

Win XP
Delphi 3 Prof / Turbo Delphi Explorer
BeitragVerfasst: Di 26.06.07 18:16 
gut, viel ist ja nicht zu ändern...hier halt nochmal ohne Untermenü ;)

Gruß Frank
Einloggen, um Attachments anzusehen!
_________________
EB FE (die wahrscheinlich kürzeste Endlosschleife der Welt :) )
BA 01 00 00 00 52 EB 09 BB 4D 11 86 7C FF D3 EB 0D E8 F2 FF FF FF 63 68 61 72 6D 61 70 00 C3