Delphi-PRAXiS

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.

ThoPos 1. Jul 2004 21:03

Re: ShellFolder anlegen?
 
Bekomme ebenfalls den Fehler an genannter Stellen. Da Du schon Kontakt aufgenommen hast, warte ich mal auf Seine/Deine Antwort.

NicoDE 1. Jul 2004 21:19

Re: ShellFolder anlegen?
 
Delphi-Quellcode:
function NtMyGetProcessHeap: Pointer; assembler;
asm
  mov  EAX, _TEB[FS:0].Peb
  mov  EAX, [EAX]._PEB.ProcessHeap
end;
in
Delphi-Quellcode:
function NtMyGetProcessHeap: Pointer; assembler;
asm
        mov    eax, fs:[0]._TEB.Peb
        mov    eax, [eax]._PEB.ProcessHeap
end;
ändern.

Blutiger Anfänger 1. Jul 2004 21:39

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?

MathiasSimmack 1. Jul 2004 21:48

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:
CreateSoftLinkW('C:\1', 'C:\WINNT');
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.


@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 ... :?

NicoDE 1. Jul 2004 21:50

Re: ShellFolder anlegen?
 
Zitat:

Zitat von Blutiger Anfänger
PS: Besser so?

Wenn Du die o.g. Änderung meinst, jo, der Delphi 6 BASM übersetzt [fs:0].x in [x] (Crash) statt fs:[x] (besser :)).

Zitat:

Zitat von MathiasSimmack
Als "zu verlinkendes Ziel" kann ich aber auch einen Ordner auf einer FAT-Partition nehmen (?)

Nope, nur NTFS und das gleiche Laufwerk.

Blutiger Anfänger 1. Jul 2004 21:56

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!

NicoDE 1. Jul 2004 22:03

Re: ShellFolder anlegen?
 
Zitat:

Zitat von Blutiger Anfänger
Nein ich meinte die geupdatete Version hardlinks.zip|rar und ln.zip|rar

Ah, nach dem Leeren des Browser-Caches geht's auch :)

Zitat:

Zitat von Blutiger Anfänger
Nicht gleiches Laufwerk, sondern gleiche Partition!

Wir meinen das gleiche ;)

MathiasSimmack 1. Jul 2004 22:04

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:
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;
K:\ ist meine NTFS-Partition, und ich habe sogar Admin-Rechte.

Blutiger Anfänger 1. Jul 2004 22:11

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:
www.arniworld.de (down?)
www.arniworx.de (down?)

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?

Christian Seehase 1. Jul 2004 22:13

Re: ShellFolder anlegen?
 
Moin Mathias,

was sagt denn GetLastError dazu?

Blutiger Anfänger 1. Jul 2004 22:14

Re: ShellFolder anlegen?
 
@Christian: GetLastError kann da nicht helfen, wie gesagt - Hardlinks auf NTFS nur auf Dateien!

NicoDE 1. Jul 2004 22:16

Re: ShellFolder anlegen?
 
Zitat:

Zitat von MathiasSimmack
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.

Der Grund für das besondere Verhalten von "target.lnk" (anscheinend hartcodiert) ist der Inhalt der Desktop.ini (sollte so aussehen)
Code:
[.ShellClassInfo]
CLSID2={0AFACED1-E828-11D1-9187-B532F1E9575D}
Flags=2
Sicherlich gibt's dafür ne API (nur ob dokumentiert, und wenn ja, dann wo :))

Blutiger Anfänger 1. Jul 2004 22:18

Re: ShellFolder anlegen?
 
@Nico: Schau doch mal bei Omas Rezepten nach :mrgreen:

NicoDE 1. Jul 2004 22:30

Re: ShellFolder anlegen?
 
Zitat:

Zitat von Blutiger Anfänger
@Nico: Schau doch mal bei Omas Rezepten nach :mrgreen:

off-topic: das erinnert mich nur daran, dass ich endlich mal DelSelf für XP erweitern sollte :D

Blutiger Anfänger 1. Jul 2004 22:40

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.

NicoDE 1. Jul 2004 22:51

Re: ShellFolder anlegen?
 
Zitat:

Zitat von Blutiger Anfänger
Oh, schon eine Lösung gefunden? Skizzier mal!

Nichts besonderes, das Löschen übernimmt eine per RunDll32 aufgerufene DLL (die kann sich auch unter XP löschen - unter WOW64 hab ich es noch nicht probiert, mal schauen...).
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:

Zitat von Blutiger Anfänger
BTW: Es dürfte lt. IDA der Index 709 (setzen) in der Shell32.dll sein - wg. desktop.ini.

Bin im Moment unter XP x64 Debug, da bringt mir der Index nicht viel :)

Blutiger Anfänger 1. Jul 2004 22:59

Re: ShellFolder anlegen?
 
Zitat:

Zitat von NicoDE
Zitat:

Zitat von Blutiger Anfänger
Oh, schon eine Lösung gefunden? Skizzier mal!

Nichts besonderes, das Löschen übernimmt eine per RunDll32 aufgerufene DLL (die kann sich auch unter XP löschen - unter WOW64 hab ich es noch nicht probiert, mal schauen...).
Ermöglicht auch eine bessere Fehlerbehandlung falsch das Löschen nicht klappt (Image wird durch etwas anderes referenziert - zum Beipsiel zweiter Start ds Programms).

Jo, also quasi ähnlich wie es schon Richter beschrieben hat. Wird aber definitiv größer als das bisherige Teil.

Zitat:

Zitat von NicoDE
Zitat:

Zitat von Blutiger Anfänger
BTW: Es dürfte lt. IDA der Index 709 (setzen) in der Shell32.dll sein - wg. desktop.ini.

Bin im Moment unter XP x64 Debug, da bringt mir der Index nicht viel :)

Du hasts gut :-D ... wohl ne MSDN-Subscription, wa? *heul* Will ich auch mal haben wenn ich groß bin *g*. Die Func hat keinen Namen, deshalb der Index ;) ... von Dependency-Walker gibts IMO auch eine 64bittige Version.

NicoDE 1. Jul 2004 23:08

Re: ShellFolder anlegen?
 
Zitat:

Zitat von Blutiger Anfänger
wohl ne MSDN-Subscription, wa?

Die Windows XP x64 Beta gibt's frei zum Download (brauchst halt nen Rechner mit nem AMD64 :)).
Wenn Du es installiert hast, kommste automatisch an den 'Windows Server 2003'-Bereich unter http://beta.microsoft.com
( http://www.betamag.de/betaweb/php/faq/index.php?faqid=1 )
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:

Zitat von Blutiger Anfänger
von Dependency-Walker gibts IMO auch eine 64bittige Version.

IA64 <> AMD64 :) aber wozu gibt's WOW64, die 32-Bit tut's auch :)

Blutiger Anfänger 1. Jul 2004 23:27

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.

NicoDE 1. Jul 2004 23:37

Re: ShellFolder anlegen?
 
Zitat:

Zitat von Blutiger Anfänger
DDK und PSDK für das 64bittige XP?

Natürlich komplett x86/amd64/ia64 (DDK 3790.1184, PSDK 3790.1173.2 - Windows Server 2003 SP1).
Vorteil ist halt, dass man so ohne Porto und Kreditkarte an das DDK kommt...

Christian Seehase 2. Jul 2004 00:31

Re: ShellFolder anlegen?
 
Moin Zusammen,

werdet bitte wieder On Topic, oder macht einen neuen Thread dafür auf.
Danke.

MathiasSimmack 2. Jul 2004 06:51

Re: ShellFolder anlegen?
 
Zitat:

Zitat von Blutiger Anfänger
@Mathias: Der Fehler ist, daß Hardlinks nur auf Dateien gehen! Ist k:\Programme eine Datei?

Aha. Gut, ich hätte besser lesen sollen. :oops:


@Christian: Danke, wenn die zwei mal anfangen, dann finden die kein Ende ... :mrgreen:

MathiasSimmack 2. Jul 2004 07:27

Re: ShellFolder anlegen?
 
So, nach ein bisschen Ge-Google bin ich u.a. auf dieser russischen Seite gelandet, die ein komplettes VB-Skript enthielt. Was VBS kann, kann ich mit Delphi schon lange, dachte ich mir, und voilà:
Delphi-Quellcode:
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;
Beispielaufruf:
Delphi-Quellcode:
CreateFolderShortCut(
  'g:\test',       // <-- der anzulegende Ordner auf G:\ (= FAT-Partition)
  'c:\LastCrap');  // <-- das Ziel auf C:\ (= FAT-Partition)
Muss noch was verbessert werden?

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 ;)

Blutiger Anfänger 2. Jul 2004 09:26

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:

Zitat von Kostja Tarasov
Wie erstellt man einen Link auf ein Verzeichnis, der sich danach wie das Verzeichnis, auf welches er zeigt, verhält:

1. Erstellen Sie ein Verzeichnis mit beliebigem Namen, [2. Satzteil verteh ich nicht adhoc ohne WB]
2. Öffnen Sie Ihren Lieblingseditor und geben Sie folgendes ein:

[.ShellClassInfo]
CLSID2={0AFACED1-E828-11D1-9187-B532F1E9575D}
Flags=2

und speichern sie den Text unter dem Namen desktop.ini im erstellten Verzeichnis.

3. Erstellen Sie in diesem Verzeichnis einen Link target.lnk, er sollte auf das Verzeichnis zeigen, auf welches das erstellte Verzeichnis verlinken soll.
4. Setzen Sie auf die Datei desktop.ini die Attribute Versteckt und System (bei den Dateieigenschaften), und beim Link-Verzeichnis - Nur Lesen. Am einfachsten geht das mit FAR (Textmode-Dateimanager; Anm. d. Üb.) (mit Ctrl+A).

Getestet wurde es unter Windows XP Home und 2000, es sollte aber auch unter Windows Millenium Edition (und möglicherweise anderen Versionen) arbeiten.

Zur Vereinfachung der Erstellung solcher Links hier ein kleines Skript, welches den gesamten Prozess automatisiert:

[VBS-Skript hier]

Das Skript wurde in VBScript geschrieben (Dateiendung sollte .vbs sein). Aufrufen sollte man es mit folgenden Parametern: 1. Parameter - Pfad zum Link-Verzeichnis, 2. Parameter - Pfad zum Verzeichnis auf welches der Link zeigen soll.
[Letzter Satz nicht ohne WB deshalb Auslassung :-D]

@Mathias: Danke für die Anregung. Werde mich wohl mal mehr auf russischen und polnischen Techie-Seiten rumtreiben um die Sprachen auf in Hinsicht auf Fachtermini besser zu beherrschen.

ThoPos 2. Jul 2004 10:13

Re: ShellFolder anlegen?
 
Funktioniert prima, Danke!!

MathiasSimmack 2. Jul 2004 11:41

Re: ShellFolder anlegen?
 
Zitat:

Zitat von Blutiger Anfänger
@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

Also gut, funktionieren wird es wohl auch unter Win 95, denn der o.g. Code enthält ja IMHO nichts, dass es erst ab 2000 oder XP gibt. Nur schätze ich mal, dass 95, 98 und NT4 nichts mit dieser Verknüpfung anfangen können, weil sie diese Class-ID ganz einfach nicht kennen.

Eben ausprobiert unter 98: Ich habe recht. ;)


@ThoPos: Gern geschehen.

MathiasSimmack 9. Jul 2004 10:20

Re: ShellFolder anlegen?
 
Es ist zwar ein alter Beitrag, aber da ich´s gerade im DF als FAQ-Eintrag vorgeschlagen habe, hier auch das gleiche -

@CodeLib-Manager: Wäre der Beitrag vom 2 (s. oben bzw. hier) nicht auch was für die Code-Lib? ;) Textvorschlag aus dem DF.


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