AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

ShellFolder anlegen?

Ein Thema von ThoPos · begonnen am 30. Jun 2004 · letzter Beitrag vom 9. Jul 2004
Antwort Antwort
Seite 1 von 4  1 23     Letzte »    
ThoPos

Registriert seit: 30. Jun 2004
Ort: Köln
69 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#1

ShellFolder anlegen?

  Alt 30. Jun 2004, 20:08
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?
Thomas
  Mit Zitat antworten Zitat
MathiasSimmack
(Gast)

n/a Beiträge
 
#2

Re: ShellFolder anlegen?

  Alt 30. Jun 2004, 21:36
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.
  Mit Zitat antworten Zitat
ThoPos

Registriert seit: 30. Jun 2004
Ort: Köln
69 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#3

Re: ShellFolder anlegen?

  Alt 30. Jun 2004, 22:07
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!
Thomas
  Mit Zitat antworten Zitat
MathiasSimmack
(Gast)

n/a Beiträge
 
#4

Re: ShellFolder anlegen?

  Alt 1. Jul 2004, 08:55
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.
  Mit Zitat antworten Zitat
ThoPos

Registriert seit: 30. Jun 2004
Ort: Köln
69 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#5

Re: ShellFolder anlegen?

  Alt 1. Jul 2004, 13:36
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.
Thomas
  Mit Zitat antworten Zitat
MathiasSimmack
(Gast)

n/a Beiträge
 
#6

Re: ShellFolder anlegen?

  Alt 1. Jul 2004, 16:39
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?
  Mit Zitat antworten Zitat
ThoPos

Registriert seit: 30. Jun 2004
Ort: Köln
69 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#7

Re: ShellFolder anlegen?

  Alt 1. Jul 2004, 17:14
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?
Thomas
  Mit Zitat antworten Zitat
MathiasSimmack
(Gast)

n/a Beiträge
 
#8

Re: ShellFolder anlegen?

  Alt 1. Jul 2004, 19:42
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?
  Mit Zitat antworten Zitat
ThoPos

Registriert seit: 30. Jun 2004
Ort: Köln
69 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#9

Re: ShellFolder anlegen?

  Alt 1. Jul 2004, 19:53
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.
Thomas
  Mit Zitat antworten Zitat
MathiasSimmack
(Gast)

n/a Beiträge
 
#10

Re: ShellFolder anlegen?

  Alt 1. Jul 2004, 21:30
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.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 4  1 23     Letzte »    


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:24 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