Thema: Delphi Verknüpfung erstellen

Einzelnen Beitrag anzeigen

Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.105 Beiträge
 
Delphi 11 Alexandria
 
#2
  Alt 30. Jun 2002, 15:09
Moin Daniel,

ich hab' hier mal 'ne alte Demo für das anlegen eines Shortcuts als solches

Code:
Procedure NewShellLink(Const pcsFileToLinkTo : String); // Auf diese Datei soll verwiesen werden

const // Fehlende Deklaration in Delphi
  // Zu finden in der Registry
  // HKEY_CLASSES_ROOT\Interface
  // nach IPersistFile suchen
  IID_IPersistFile: TGUID = '{0000010b-0000-0000-C000-000000000046}';
Var
  slShellLink  : IShellLink;  // ShellLink Interface
  pfPersistFile : IPersistFile; // Shortcut (Link) Permanent speichern
  wsShortCut   : PWideChar;   // Buffer für den Shortcutnamen
  hRes         : HResult;     // Für Zwischenergebnisse
  sShortCut    : String;      // So heisst dann der Shortcut


Begin
  CoInitialize(nil); // COM Library Initialisieren (einmal pro Thread deshalb hier eigentlich
                     // Fehl am Platze :(
  // COM Object der Klasse ShellLink erzeugen
  hRes := CoCreateInstance(CLSID_ShellLink,     // ID von ShellLink (Typ TGUID)
                           nil,
                           CLSCTX_INPROC_SERVER,
                           IID_IShellLinkA,     // Referenz auf die Funktion
                           slShellLink);        // erhält nach erfolgreichem Aufruf
                                                 // den Pointer auf die Funktion

  if hRes = S_OK then
  Begin
    slShellLink.SetPath(PChar(pcsFileToLinkTo)); // Auf diese Datei geht der Link
    hRes := slShellLink.QueryInterface(IID_IPersistFile, // wieder mal einen
                                       pfPersistFile);   // Pointer holen
  end;

  if hRes = S_OK then
  Begin
    GetMem(wsShortCut,MAX_PATH shl 1); // Speicher reservieren für den Shortcutpfadnamen
                                        // Eigentlich genügt die Länge MAX_PATH, aber da
                                        // der Wert in UNICode zurückgegeben wird mal 2
    sShortCut := ChangeFileExt(pcsFileToLinkTo,'.LNK'); // Soll einfach mal so heissen,
                                                        // Wie die aufzurufende Datei
    MultiByteToWideChar(CP_ACP,        // ANSI Codepage benutzen
                        0,
                        PChar(sShortCut), // Der soll konvertiert werden
                        -1,              // der zu konvertierende String ist Null terminiert
                        wsShortCut,      // und hier soll das Ergebnis rein
                        MAX_PATH shl 1); // Länge von wsShortCut
    pfPersistFile.Save(wsShortCut, TRUE); // Jetzt noch den Link speichern
    FreeMem(wsShortCut,MAX_PATH shl 1);  // und den Platz wieder freigeben
  end;
end;


procedure TForm1.Button1Click(Sender: TObject);

begin
  if Opendialog1.Execute then
  Begin
    NewShellLink(OpenDialog1.FileName);
  end;
end;
Die bedarf zwar noch einiger Überarbeitung, aber funktioniert soweit.
Wenn ich dazu komm' wird die noch mal aktualisiert.
Beim ersten Parameter von pfPersistFile.Save müsste noch der Pfad ausgetauscht werden, denn in diesem Beispiel zeigt der auf das gleiche Verzeichnis, in dem auch die Datei liegt, auf die der Link geht.

Jetzt ist noch die Frage, welchen Desktop Folder Du meinst. Current User oder All Users.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat