| Autor |
Beitrag |
JayEff
      
Beiträge: 2971
Windows Vista Ultimate
D7 Enterprise
|
Verfasst: 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  *
Wie das geht, das ist recht einfach:
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 succes := false; reg.WriteString('', 'Mit Passwort schützen'); If Not reg.OpenKey('command', true) Then succes := false; reg.WriteString('', '"' + Application.ExeName + '" "%1"'); 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 (  ) 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_
      
Beiträge: 343
Erhaltene Danke: 1
Win XP
Delphi 3 Prof / Turbo Delphi Explorer
|
Verfasst: 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 
      
Beiträge: 2971
Windows Vista Ultimate
D7 Enterprise
|
Verfasst: 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 
      
Beiträge: 2971
Windows Vista Ultimate
D7 Enterprise
|
Verfasst: 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  (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
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:
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 begin hMnu := CreatePopupMenu(); AppendMenu(hMnu, MF_STRING, idCmdFirst, 'Menüpunkt 1'); AppendMenu(hMnu, MF_STRING, idCmdFirst + 1, 'Menüpunkt 2');
hMnu2 := CreatePopupMenu(); AppendMenu(hMnu2, MF_STRING, idCmdFirst + 3, 'Untermenü');
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'); 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ü');
InsertMenuItem(Menu, indexMenu, True, mii);
if hBmp.Handle <> 0 then SetMenuItemBitmaps(Menu, indexMenu, MF_BYPOSITION, hBmp.Handle, hBmp.Handle);
Result := 4 end else Result := 0; end; |
Aber alles, was ich bisher getan hab, war die Beschriftungen verändern, was ja auch klappt  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  ). Hierbei gibt die Showmessage dann den gesammten Ordnerinhalt aus, jede Datei darin. Bei Rechtsklick auf einen Ordner wird nur der Pfad des Ordners ausgegeben. 
_________________ >+++[>+++[>++++++++<-]<-]<++++[>++++[>>>+++++++<<<-]<-]<<++
[>++[>++[>>++++<<-]<-]<-]>>>>>++++++++++++++++++.+++++++.>++.-.<<.>>--.<+++++..<+.
|
|
_frank_
      
Beiträge: 343
Erhaltene Danke: 1
Win XP
Delphi 3 Prof / Turbo Delphi Explorer
|
Verfasst: 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 
      
Beiträge: 2971
Windows Vista Ultimate
D7 Enterprise
|
Verfasst: Mo 25.06.07 00:10
_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  ), das ist's mir nicht wert 
Einloggen, um Attachments anzusehen!
_________________ >+++[>+++[>++++++++<-]<-]<++++[>++++[>>>+++++++<<<-]<-]<<++
[>++[>++[>>++++<<-]<-]<-]>>>>>++++++++++++++++++.+++++++.>++.-.<<.>>--.<+++++..<+.
|
|
_frank_
      
Beiträge: 343
Erhaltene Danke: 1
Win XP
Delphi 3 Prof / Turbo Delphi Explorer
|
Verfasst: 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 
      
Beiträge: 2971
Windows Vista Ultimate
D7 Enterprise
|
Verfasst: Mo 25.06.07 13:53
_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_
      
Beiträge: 343
Erhaltene Danke: 1
Win XP
Delphi 3 Prof / Turbo Delphi Explorer
|
Verfasst: 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 
      
Beiträge: 2971
Windows Vista Ultimate
D7 Enterprise
|
Verfasst: 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_
      
Beiträge: 343
Erhaltene Danke: 1
Win XP
Delphi 3 Prof / Turbo Delphi Explorer
|
Verfasst: 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
|
|
|