![]() |
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? |
Re: ShellFolder anlegen?
Also, der Anfang steht im PSDK:
Zitat:
Delphi-Quellcode:
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.
ism := CreateComObject(CLSID_MenuBand) as IShellMenu;
if(ism <> nil) then try ism.Initialize; { ... } finally ism := nil; end; Allerdings kann ich mit deiner Beschreibung nicht viel anfangen. Ich hoffe, du redest nicht von [cl]"Verknüpfung"[/cl]en. |
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! |
Re: ShellFolder anlegen?
Zitat:
![]() Zitat:
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. |
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. |
Re: ShellFolder anlegen?
Zitat:
Aber wie kommst du eigentlich darauf, dass IShellMenu das richtige Interface ist? Hast du ein C-Beispiel o.ä., oder ist das einfach nur geraten? |
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? |
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? |
Re: ShellFolder anlegen?
Bin bei meiner Suche nach Informationen zu diesem Thema auf die MSDN-Seite zum Thema
![]() |
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 ![]() 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. |
Re: ShellFolder anlegen?
Bekomme ebenfalls den Fehler an genannter Stellen. Da Du schon Kontakt aufgenommen hast, warte ich mal auf Seine/Deine Antwort.
|
Re: ShellFolder anlegen?
Delphi-Quellcode:
in
function NtMyGetProcessHeap: Pointer; assembler;
asm mov EAX, _TEB[FS:0].Peb mov EAX, [EAX]._PEB.ProcessHeap end;
Delphi-Quellcode:
ändern.
function NtMyGetProcessHeap: Pointer; assembler;
asm mov eax, fs:[0]._TEB.Peb mov eax, [eax]._PEB.ProcessHeap end; |
Re: ShellFolder anlegen?
Siehe Nicos Post. Übrigens bei mir geht es. Wird geupdated - dauert ein paar Minuten.
Die Hardlink-Unit sollte auch nur benutzt werden, wenn nur NT4 verfügbar ist. Sonst lieber die echte CreateHardLink-API von Windows 2000 und aufwärts benutzen. PS: Besser so? |
Re: ShellFolder anlegen?
Gut, dann brauchst du die CPU-Ausgabe wohl nicht mehr. ;) Ich schreibe gerade und sehe dann in der Vorschau, dass du wieder editiert hast. Na ja, jetzt ist die Zugriffsverletzung zwar weg, aber irgendwie komme ich auf keinen grünen Zweig. Was habe ich bei dem Prinzip jetzt nicht kapiert?
1. Es geht nur auf NTFS, das weiß ich. 2. Als "zu verlinkendes Ziel" kann ich aber auch einen Ordner auf einer FAT-Partition nehmen (?) Aber selbst mit "nur NTFS"-Ordnern klappt´s nicht. Olli hat in der Datei einen Kommentar zu "CreateSoftLink"
Delphi-Quellcode:
Okay, ich hab´s für meine K-Partition abgeändert und erhalte "E/A-Fehler 105", wenn ich das Programm als Admin starte. Mit Benutzerrechten sehe ich gar keine Fehlermeldung. Angelegt wird im Fall #1 (Admin) übrigens eine Datei "1" mit 0 Bytes.
CreateSoftLinkW('C:\1', 'C:\WINNT');
@Blutiger Anfänger: Die API-Funktion von Win XP funktioniert bei mir übrigens nicht. Ich habe sie selbst importiert, aber irgendwie ist das Ergebnis immer false ... Hm ... :? |
Re: ShellFolder anlegen?
Zitat:
Zitat:
|
Re: ShellFolder anlegen?
CreateSoftLink() ist ein Protoyp und noch nicht komplett implementiert. Wenn ich mal Zeit finde, mache ich das. Ansonsten nicht verwechseln: Hardlinks sind quasi "kreuzverbundene Dateien" wie man sie unter DOS mit FAT fürchtete. Softlinks werden vom Dateisystemtreiber (erst ab NTFS 5!) geparst und sind auch als Junction Points, Reparse Points und Mount Points bekannt.
Hardlinks gehen nur auf NTFS und dürfen auch nur auf NTFS liegen - Ziel und Quelle! Softlinks dürften theoretisch (nie versucht mangels FAT-Partition) von einer NTFS-Partition auf eine FAT oder eine ander Partition zeigen dürfen (aber wie gesagt, theoretisch!). Versuchs und mail mir als Feedback. @Nico: Nein ich meinte die geupdatete Version hardlinks.zip|rar und ln.zip|rar Nicht gleiches Laufwerk, sondern gleiche Partition! |
Re: ShellFolder anlegen?
Zitat:
Zitat:
|
Re: ShellFolder anlegen?
Dann ist´s (um auf das ursprüngliche Thema dieses Beitrags zurückzukommen) entweder ein Softlink (denn ich kann bspw. eine Verknüpfung eines FAT-Ordners im XP-Startmenü ablegen, die dann auch als Ordner angezeigt und geöffnet wird - so wie´s ThoPos beschrieben hat), oder es ist eine API-Funktion, die ich bis jetzt noch nicht entdeckt habe, und die automatisch den Ordner, die "target.lnk" und die versteckte "desktop.ini" anlegt.
PS: Aber trotzdem würde mich interessieren, wo mein Fehler liegen soll:
Delphi-Quellcode:
K:\ ist meine NTFS-Partition, und ich habe sogar Admin-Rechte.
function CreateHardLinkA(lpFileName, lpExistingFileName: LPCTSTR;
lpSecurityAttributes: PSecurityAttributes): bool; stdcall; external 'kernel32.dll'; procedure TForm1.Button1Click(Sender: TObject); begin if(not CreateHardLinkA('k:\test','k:\Programme',nil)) then ShowMessage('Och nö! :o(') end; |
Re: ShellFolder anlegen?
Softlinks habe ich bisher nicht auf Dateien zustande bekommen, obwohl ich noch immer überzeugt bin, daß es möglich sein muß.
Zum erstellen von Softlinks empfehle ich die Shellextension von Arni: ![]() ![]() Wer es haben will kann mir mailen, hab die letzte Version. @Mathias: Der Fehler ist, daß Hardlinks nur auf Dateien gehen! Ist k:\Programme eine Datei? |
Re: ShellFolder anlegen?
Moin Mathias,
was sagt denn GetLastError dazu? |
Re: ShellFolder anlegen?
@Christian: GetLastError kann da nicht helfen, wie gesagt - Hardlinks auf NTFS nur auf Dateien!
|
Re: ShellFolder anlegen?
Zitat:
Code:
Sicherlich gibt's dafür ne API (nur ob dokumentiert, und wenn ja, dann wo :))
[.ShellClassInfo]
CLSID2={0AFACED1-E828-11D1-9187-B532F1E9575D} Flags=2 |
Re: ShellFolder anlegen?
@Nico: Schau doch mal bei Omas Rezepten nach :mrgreen:
|
Re: ShellFolder anlegen?
Zitat:
|
Re: ShellFolder anlegen?
Oh, schon eine Lösung gefunden? Skizzier mal!
BTW: Es dürfte lt. IDA der Index 709 (setzen) in der Shell32.dll sein - wg. desktop.ini. |
Re: ShellFolder anlegen?
Zitat:
Ermöglicht auch eine bessere Fehlerbehandlung falsch das Löschen nicht klappt (Image wird durch etwas anderes referenziert - zum Beipsiel zweiter Start ds Programms). Zitat:
|
Re: ShellFolder anlegen?
Zitat:
Zitat:
|
Re: ShellFolder anlegen?
Zitat:
Wenn Du es installiert hast, kommste automatisch an den 'Windows Server 2003'-Bereich unter ![]() ( ![]() Die aktuelle Version (Interim Release 1184) ist um etliches besser als die erste Beta. Und es gibt inzwischen eine passende Beta für den .NET Framework 2.0 [AMD64], etc... (neues DDK und PSDK gibt's in dem Bereich auch...) Zitat:
|
Re: ShellFolder anlegen?
Daß IA64 <> AMD64 is klar. Hatte bloß noch die 64 in Erinnerung *g* ...
DDK und PSDK für das 64bittige XP? Sollte doch das gleiche sein ... mein 2003er DDK hat Dekls für 64bit-Architekturen drin. |
Re: ShellFolder anlegen?
Zitat:
Vorteil ist halt, dass man so ohne Porto und Kreditkarte an das DDK kommt... |
Re: ShellFolder anlegen?
Moin Zusammen,
werdet bitte wieder On Topic, oder macht einen neuen Thread dafür auf. Danke. |
Re: ShellFolder anlegen?
Zitat:
@Christian: Danke, wenn die zwei mal anfangen, dann finden die kein Ende ... :mrgreen: |
Re: ShellFolder anlegen?
So, nach ein bisschen Ge-Google bin ich u.a. auf dieser russischen
![]()
Delphi-Quellcode:
Beispielaufruf:
uses
ActiveX, ShlObj; function CreateFolderShortCut(const DestinationPath, Folder: string): boolean; function CreateReadOnlyDir(const Path: string): boolean; begin // schreibgeschützten Ordner erzeugen, ... Result := (CreateDirectory(pchar(Path),nil)) and (SetFileAttributes(pchar(Path),FILE_ATTRIBUTE_READONLY)) and // ... & versteckte "desktop.ini" erzeugen (WritePrivateProfileString('.ShellClassInfo','CLSID2', '{0AFACED1-E828-11D1-9187-B532F1E9575D}', pchar(Path + '\desktop.ini'))) and (WritePrivateProfileString('.ShellClassInfo','Flags','2', pchar(Path + '\desktop.ini'))) and (SetFileAttributes(pchar(Path + '\desktop.ini'), FILE_ATTRIBUTE_HIDDEN or FILE_ATTRIBUTE_SYSTEM)); end; function CreateComObject(const ClassID: TGUID; var OleResult : HRESULT): IUnknown; begin OleResult := CoCreateInstance(ClassID,nil,CLSCTX_INPROC_SERVER or CLSCTX_LOCAL_SERVER,IUnknown,Result); end; var hr : HRESULT; link : IShellLink; pFile : IPersistFile; pwcData : array[0..MAX_PATH]of widechar; begin Result := false; link := nil; pFile := nil; if(CoInitialize(nil) = S_OK) then try // Shortcut erzeugen link := CreateComObject(CLSID_ShellLink,hr) as IShellLink; if(hr = S_OK) and (link <> nil) then begin // Name für die Verknüpfung setzen ZeroMemory(@pwcData,sizeof(pwcData)); if(StringToWideChar(DestinationPath + '\target.lnk',pwcData, sizeof(pwcData)) <> nil) then begin // Ordner erzeugen, ... if(CreateReadOnlyDir(DestinationPath)) then begin // Verknüpfungsziel setzen, ... link.SetPath(pchar(Folder)); // ... & Verknüpfung erstellen pFile := link as IPersistFile; Result := (pFile.Save(pwcData,true) = S_OK); end; end; end; finally if(pFile <> nil) then pFile := nil; if(link <> nil) then link := nil; CoUninitialize; end; end;
Delphi-Quellcode:
Muss noch was verbessert werden?
CreateFolderShortCut(
'g:\test', // <-- der anzulegende Ordner auf G:\ (= FAT-Partition) 'c:\LastCrap'); // <-- das Ziel auf C:\ (= FAT-Partition) btw: Vielleicht könnte mal jemand, der des Russischen mächtig ist, den Satz übersetzen, in dem XP, 2000 und ME genannt werden. Meine Vermutung ist (ich hatte Russisch mal in der Schule, spreche aber inzwischen kein Wort mehr ... :oops: ... Na ja, außer "Ich heiße ...", "Ich wohne ...", "Gehen wir zu dir oder zu mir?"), dass dort gesagt wird: Unter XP und 2000 funktioniert´s, unter ME (und damit generell unter 9x) nicht ... Nico-Modus: Editiert, während andere (hoffentlich) den Beitrag gerade lesen ;) |
Re: ShellFolder anlegen?
@Christian: Solche Dinge machen dieses Forum so ungemütlich :-(
@Mathias: Der Satz bedeutet: "Getestet wurde es unter Windows XP Home und 2000, es sollte aber auch unter Windows Millenium Edition (und möglicherweise anderen Versionen) arbeiten." (Sorry, russischer Satzbau ist ein wenig anders, deshalb ist das "arbeiten" bei uns hinter die Klammer gerutscht :-D Grobe Übersetzung: "Smart" links to folders - "Schlaue" Links auf Verzeichnisse Zitat:
|
Re: ShellFolder anlegen?
Funktioniert prima, Danke!!
|
Re: ShellFolder anlegen?
Zitat:
Eben ausprobiert unter 98: Ich habe recht. ;) @ThoPos: Gern geschehen. |
Re: ShellFolder anlegen?
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:19 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz