Delphi-PRAXiS
Seite 1 von 4  1 23     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   ShellFolder anlegen? (https://www.delphipraxis.net/25073-shellfolder-anlegen.html)

ThoPos 30. Jun 2004 19:08


ShellFolder anlegen?
 
Hallo,

kann mir jemand sagen, wie man mit Delphi 7 einen Ordner (Typ IShellMenu) im Startmenü erstellt, der aus einen anderen Ordner mit weiteren Links verlinkt?

MathiasSimmack 30. Jun 2004 20:36

Re: ShellFolder anlegen?
 
Also, der Anfang steht im PSDK:
Zitat:

To get a pointer to this interface, call CoCreateInstance with the rclsid parameter set to CLSID_MenuBand and the riid parameter set to IID_IShellMenu. You must first initialize the interface by calling IShellMenu::Initialize, and then initialize the menu band by calling IShellMenu::SetShellFolder.
CoCreateInstance brauchst du, so gesehen, nicht. Du kannst stattdessen CreateComObject (ComObj-Unit) benutzt, da steckt der o.g. Befehl drin. Also etwa:
Delphi-Quellcode:
ism := CreateComObject(CLSID_MenuBand) as IShellMenu;
if(ism <> nil) then
try
  ism.Initialize;

  { ... }
finally
  ism := nil;
end;
Angabe ohne Gewähr, aber prinzipiell geht´s mit den meisten Interfaces so. Hinter dem MS-XML-Interface DomDocument40 steckt in der Create-Funktion nämlich auch nichts anderes.

Allerdings kann ich mit deiner Beschreibung nicht viel anfangen. Ich hoffe, du redest nicht von [cl]"Verknüpfung"[/cl]en.

ThoPos 30. Jun 2004 21:07

Re: ShellFolder anlegen?
 
So ähnlich habe ich es probiert. Aber der Compiler meldet immer, daß er IShellMenu nicht kennt. Andere IShell...-Ausdrücke, wie z.B. IShellLink kennt er.

Zum Verständnis meiner Frage, ich möchte auf Wechselmedien (CD, USB-Datenträger, etc.) Programme, Tools, etc. installieren. Auf dem Datenträger ist dann in einem Ordner ?:\Startmenü die Menüstruktur für das Windows-Startmenü abgelegt. Beim Einlegen des Datenträger läuft soll dann ein Autorun-Programm starten, daß den Laufwerksbuchstaben prüft und ggf. ändert. Anschließend soll - sofern nicht vorhanden - im Startmenu (%UserProfile%\Startmenü\Programme\) eine Ordner-Verknüpfung angelegt werden.
Mit IShellLink funktioniert es nicht, da öffnet sich nach anklicken der Verknüpfung ein Fenster mit den weiteren Ordnern/Links. Es soll aber das Menü normal aufgeklappt werden.

Wenn man die Verküpfung unter XP manuell anlegt, funktioniert es!

MathiasSimmack 1. Jul 2004 07:55

Re: ShellFolder anlegen?
 
Zitat:

Zitat von ThoPos
So ähnlich habe ich es probiert. Aber der Compiler meldet immer, daß er IShellMenu nicht kennt.

Ja, der Grund ist einfach der, dass Delphi 7 dieses Interface noch nicht kennt. Und damit IMHO auch keine der Vorgängerversionen. Weil selbst Bei Google suchenGoogle nichts findet, wirst du die Funktionen selbst von C nach Delphi umsetzen müssen.

Zitat:

Wenn man die Verküpfung unter XP manuell anlegt, funktioniert es!
Wenn das eine normale Verknüpfung ist, dann klappt das aber auch mit IShellLink, denn hinter den Verknüpfungen steht ja eben dieses Interface. Es wäre also durchaus denkbar, dass sich irgendwo einfach nur ein kleiner Fehler eingeschlichen hatte, so dass es deshalb nicht gleich funktionierte.

IShellMenu wird IMHO verwendet, um bspw. das Start- oder Favoritenmenü einfacher verwalten und evtl. in eigene Anwendungen integrieren zu können. Aber das lasse ich mal so im Raum stehen, denn ich habe gestern bloß einen kurzen Blick ins PSDK geworfen um herauszufinden, was dieses IShellMenu überhaupt macht.

ThoPos 1. Jul 2004 12:36

Re: ShellFolder anlegen?
 
Mit IShellLink habe ich es in allen mir bekannten Varianten probiert. Ich erhalte immer nur einen Eintrag im Startmenü, bei dessen anklicken sich der verknüpfte Ordner als neues Fenster öffnet.
Wenn ich mir die Windows-eigenen Eigenschaftsfenster der beiden Verknüpfungen ansehen, so sind dort signifikante Unterschiede erkennbar. Wenn ich mir in der CMD-Box das Verzeichnis ansehe, so ist der mit IShellLink erstelle "Ordner" eine Verknüpfung ".lnk". Bei dem manuell erstellten Ordner habe ich scheinbar einen "normalen" Ordner, der eine Datei namens "target.lnk" enthält. Aber der Ordner besitz definitiv andere Eigenschaften, als ein mit MkDir erstellter Ordner.
Beim Umsetzen des IShellMenu-Objektes aus C in Delphi werde ich sicherlich verzweifeln, da ich keine Ahnung von C habe und meine Delphi-Kenntnisse noch im Anfänger-Status sind. Ich komme aus der VBA-Programmierung für Excel und Word.

MathiasSimmack 1. Jul 2004 15:39

Re: ShellFolder anlegen?
 
Zitat:

Zitat von ThoPos
Wenn ich mir die Windows-eigenen Eigenschaftsfenster der beiden Verknüpfungen ansehen, so sind dort signifikante Unterschiede erkennbar. Wenn ich mir in der CMD-Box das Verzeichnis ansehe, so ist der mit IShellLink erstelle "Ordner" eine Verknüpfung ".lnk". Bei dem manuell erstellten Ordner habe ich scheinbar einen "normalen" Ordner, der eine Datei namens "target.lnk" enthält. Aber der Ordner besitz definitiv andere Eigenschaften, als ein mit MkDir erstellter Ordner.

Ich will dir keine Unfähigkeit vorwerfen, aber wenn du den Ordner auf die normale Art und Weise erstellt hast, dann ist das auch ein stinknormaler Ordner. In dem Fall müsstest du ermitteln, in welchem Ordner das Startmenü steckt (die ganzen Shell-Funktionen helfen dabei, [dp]"SHGetSpecialFolderLocation"[/dp] bspw.), und dort erzeugst du dann den normalen Ordner und in selbigem die eigentliche Verknüpfung. Damit hättest du programm-technisch IMHO den manuellen Weg nachgebildet, und es sollte funktionieren.

Aber wie kommst du eigentlich darauf, dass IShellMenu das richtige Interface ist? Hast du ein C-Beispiel o.ä., oder ist das einfach nur geraten?

ThoPos 1. Jul 2004 16:14

Re: ShellFolder anlegen?
 
Sorry,
ich hatte mich mit der Aussage "manuell erstellt" unpräzise ausgedrückt.
Ich habe den Ordner vom USB-Stick kopiert und dann mit "Verküpfung einfügen" im Startmenü abgelegt und anschließend umbenannt. Und dieses Vorgehen unterscheidet sich von dem Befehl "Neuer Ordner" bzw. dem mit IShellLink angelegten Ordner-Verknüpfung. Ich weis nur noch nicht wie?

MathiasSimmack 1. Jul 2004 18:42

Re: ShellFolder anlegen?
 
Das beantwortet aber noch nicht
diese Frage
Aber wie kommst du eigentlich darauf, dass IShellMenu das richtige Interface ist? Hast du ein C-Beispiel o.ä., oder ist das einfach nur geraten?

ThoPos 1. Jul 2004 18:53

Re: ShellFolder anlegen?
 
Bin bei meiner Suche nach Informationen zu diesem Thema auf die MSDN-Seite zum Thema ShellMenu gestoßen. Nach meiner Interpretation kamen von den dort aufgeführten Shell-Klassen nur IShellFolder oder IShellMenu in Frage. IShellMenu schien mir am wahrscheinlichsten.

MathiasSimmack 1. Jul 2004 20:30

Re: ShellFolder anlegen?
 
Also, ich hab´s eben auch mal probiert. Das sieht mir mehr nach einer Art "Hard link" aus. Wie ich bemerkt habe, ist der Name der Verknüpfung "target.lnk" (hast du ja auch erwähnt), und wenn man den ändert, dann funktioniert die Sache nicht mehr. Außerdem steckt noch eine versteckte "desktop.ini" im gleichen Ordner. ;)

Du könntest dein Glück mal mit Assarbads Hardlink-Unit versuchen. Bei mir (Win XP) kam es leider zu einer Zugriffsverletzungen. Ich muss mal Assarbad kontaktieren, was die Ursache sein könnte. (@Assa: der Cursor steht bei "NtMyGetProcessHeap" :?)


Aber wie dem auch sei, ich denke, eine passende API-Funktion könnte die Lösung deines Problems sein. Das o.g. Interface wirst du gar nicht brauchen, und IMHO erfüllt es ohnehin eine andere Aufgabe.


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:29 Uhr.
Seite 1 von 4  1 23     Letzte »    

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