Announcement

Collapse
No announcement yet.

Verknüpfung erstellen.

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Verknüpfung erstellen.

    Ich möchte über ein Delphi-Programm eine Verknüpfung eines anderen Programms auf dem Desk-Top erstellen.
    Außerdem muß ich bei dieser Verknüpfung das "Ziel" & "Ausführen in" bearbeiten konnen.
    Wie geht das?
    Danke schon mal im voraus.

    Rasmus

  • #2
    Hallo,
    das folgende Beispiel demonstriert, wie das Arbeitsverzeichnis für eine Verknüpfung definiert werden kann (über <b>IShellLink.SetWorkingDirectory</b>):
    <pre>
    uses
    ShlObj, ActiveX, ComObj;

    procedure TFormMain.BitBtnStartClick(Sender: TObject);
    var
    aObject : IUnknown;
    aSLink : IShellLink;
    aPFile : IPersistFile;
    sDirectory : String;
    wsFileName : WideString;
    szWinDir : array[0..29] of Char;
    begin
    StatBar.SimpleText := '';
    FillChar(szWinDir, SizeOf(szWinDir), #0);
    GetWindowsDirectory(szWinDir, SizeOf(szWinDir));
    // ShellLink-Objekt anfordern
    aObject := CreateComObject(CLSID_ShellLink);
    // Verbindung zum IShellLink-Interface herstellen
    aSLink := aObject as IShellLink;
    // Verbindung zum IPersistFile-Interface herstellen
    aPFile := aObject as IPersistFile;
    // Verknüpfung über IShellLink definieren
    with aSLink do begin
    // Programmpfad festlegen
    SetPath(PChar(EditPrg.Text));
    // Programmparameter festlegen
    SetArguments(PChar(EditParam.Text));
    // Arbeitsverzeichnis festlegen
    SetWorkingDirectory(szWinDir);
    end;
    // Pfad des gewünschten Shellfolders ermitteln
    if RadioGroupSort.ItemIndex = 0
    then sDirectory := GetShellFolderPath(CSIDL_DESKTOPDIRECTORY)
    else sDirectory := GetShellFolderPath(CSIDL_STARTMENU);
    Assert(sDirectory[Length(sDirectory)] <> '\', 'Backslash!');
    wsFileName := sDirectory + '\' + EditLNK.Text;
    // Verknüpfung über IPersistFile anlegen
    aPFile.Save(PWChar(wsFileName), False);
    StatBar.SimpleText := Format('Der Link »%s« wurde angelegt!',
    [EditLNK.Text]);
    end;

    </pre&gt

    Comment


    • #3
      Klasse, es klapt!
      Vielen Dank.
      Leider funktioniert der Befehl "GetShellFolderPath" nicht. Ich arbeite mit Delphi 3. Kann es daran liegen?
      Außer dem müßte ich noch das Symbol ändern. Wie geht das.

      Danke
      rass

      Comment


      • #4
        Hallo,

        für das Icon der Verknüpfung ist die <b>IShellLink</b>-Interfacemethode <b>SetIconLocation</b> zuständig. Das könnte zum Beispiel so aussehen (bei der Verknüpfung wird das 2. Iconsymbol von NOTEPAD.EXE verwendet):
        <pre>
        uses
        ShlObj, ActiveX, ComObj;

        procedure TFormMain.BitBtnStartClick(Sender: TObject);
        var
        aObject : IUnknown;
        aSLink : IShellLink;
        aPFile : IPersistFile;
        sDirectory : String;
        wsFileName : WideString;
        szWinDir : array[0..29] of Char;
        begin
        StatBar.SimpleText := '';
        FillChar(szWinDir, SizeOf(szWinDir), #0);
        GetWindowsDirectory(szWinDir, SizeOf(szWinDir));
        // ShellLink-Objekt anfordern
        aObject := CreateComObject(CLSID_ShellLink);
        // Verbindung zum IShellLink-Interface herstellen
        aSLink := aObject as IShellLink;
        // Verbindung zum IPersistFile-Interface herstellen
        aPFile := aObject as IPersistFile;
        // Verknüpfung über IShellLink definieren
        with aSLink do begin
        // Programmpfad festlegen
        SetPath(PChar(EditPrg.Text));
        // Programmparameter festlegen
        SetArguments(PChar(EditParam.Text));
        // Arbeitsverzeichnis festlegen
        SetWorkingDirectory(szWinDir);
        // Icon setzen
        SetIconLocation(PChar(EditPrg.Text), 1);
        end;
        // Pfad des gewünschten Shellfolders ermitteln
        if RadioGroupSort.ItemIndex = 0
        then sDirectory := GetShellFolderPath(CSIDL_DESKTOPDIRECTORY)
        else sDirectory := GetShellFolderPath(CSIDL_STARTMENU);
        Assert(sDirectory[Length(sDirectory)] <> '\', 'Backslash!');
        wsFileName := sDirectory + '\' + EditLNK.Text;
        // Verknüpfung über IPersistFile anlegen
        aPFile.Save(PWChar(wsFileName), False);
        StatBar.SimpleText := Format('Der Link »%s« wurde angelegt!',
        [EditLNK.Text]);
        end;
        </pre>
        Hinter <b>GetShellFolderPath</b> verbirgt sich keine API-Funktion, sondern eine eigene private Methode, die alle notwendigen Zwischenschritte für die API-Funktion <b>SHGetSpecialFolderLocation</b> einkapselt:
        <pre>
        { Private Methode liest über ShellAPI den Pfadnamen aus }

        function TFormMain.GetShellFolderPath(const aFolder: Integer): String;
        var
        pIIL : PItemIDList;
        szPath : array[0..MAX_PATH] of Char;
        aMalloc : IMalloc;
        begin
        Result := '';
        Assert(aFolder <= CSIDL_PRINTHOOD,'Falsche Shellfolder-Konstante');
        OleCheck(SHGetSpecialFolderLocation(0, aFolder, pIIL));
        SHGetPathFromIDList(pIIL, szPath);
        OleCheck(SHGetMalloc(aMalloc));
        aMalloc.Free(pIIL);
        Result := szPath;
        end;
        </pre&gt

        Comment


        • #5
          Hallo Herr Kosch,

          ich habe das Beispiel unter NT 4 getestet.
          Allerdings lassen sich die Links nur mit Admin Rechten erstellen.

          Gibt es eine Möglichkeit Links zu erstellen ohne Adminrechte zu haben

          Comment

          Working...
          X