Entwickler-Ecke

Windows API - Verknüpfung auf dem Desktop?


Fritz the Cat - So 05.06.05 19:55
Titel: Verknüpfung auf dem Desktop?
Hallo,

meine Anwendung ist nun so gut wie fertig. Habe mir noch ein eigenes Setup zusammen geschoben (sprich das entpacken von CD auf die Festplatte). Was mir zu meinen Glück noch fehlt, ist eine Verknüpfung auf dem Desktop.

Eines vorweg. Eine Verknüpfung konnte ich schon erfolgreich in jeden beliebigen ("normalen") Ordner erstellen.


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
uses ShlOBJ, ActiveX, ComObj;

function CreateLink(Source,Target,Beschreibung:string):Boolean;
var psl : IShellLink;
    ppf : IPersistFile;
const
  IID_IPersistFile:
     TGUID = (D1:$0000010B;
              D2:$0000;
              D3:$0000;
              D4:($C0,$00,$00,$00,$00,$00,$00,$46));
begin
    result := False;
    if SUCCEEDED(CoCreateInstance(CLSID_ShellLink, nil, CLSCTX_INPROC_SERVER, IID_IShellLinkA, psl)) then begin
       psl.SetPath(PChar(Source));
       psl.SetDescription(PChar(Beschreibung));
       if SUCCEEDED(psl.QueryInterface(IID_IPersistFile,ppf)) then begin
           ppf.Save(StringToOLEStr(Target),TRUE);
           Result := true;
         end;
       end;
end;

procedure TStart.Button2Click(Sender: TObject);
begin
 CreateLink('C:\Test2\Project.exe','C:\Test2\Project.lnk','Project');
end;

end.


Jetzt meine Frage: Was muß ich in meinen Aufruf ändern, damit die Verknüpfung nicht im Install-Verzeichnis(C:\Test2) landet, sondern auf dem Desktop?

Danke im voraus.


Delete - So 05.06.05 22:53

In dem du dir mit dir den Desktop Ordner ermittelst: http://www.luckie-online.de/Delphi/Sonstiges/GetSpecialFolder.html


Delete - So 05.06.05 23:03
Titel: Re: Verknüpfung auf dem Desktop?
user profile iconFritz the Cat hat folgendes geschrieben:
Habe mir noch ein eigenes Setup zusammen geschoben (sprich das entpacken von CD auf die Festplatte). Was mir zu meinen Glück noch fehlt, ist eine Verknüpfung auf dem Desktop.

Nimm ein richtiges Setup, etwa Inno Setup [http://www.jrsoftware.org/isinfo.php]. Da ist alles drin, was man braucht. :)


Blackheart - So 05.06.05 23:08


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
procedure DesktopLink (Filename,LinkName,Arguments: String); 
var tmpObject : IUnknown; 
    tmpSLink : IShellLink; 
    tmpPFile : IPersistFile; 
    PIDL : PItemIDList; 
    LinkFileName: WideString; 
    DesktopDirectory : array[0..MAX_PATH] of Char; 
begin 
 {benötigt ShlObj, ActiveX, ComObj in der uses} 
 tmpObject := CreateComObject(CLSID_ShellLink); 
 tmpSLink := tmpObject as IShellLink; 
 tmpPFile := tmpObject as IPersistFile; 
 if Arguments<>'' then 
 tmpSLink.SetArguments(pchar(Arguments)); 
 tmpSLink.SetPath(pChar(Filename)); 
 tmpSLink.SetWorkingDirectory(pChar(ExtractFilePath(Filename))); 
 SHGetSpecialFolderLocation(0,CSIDL_DESKTOPDIRECTORY,PIDL); 
 SHGetPathFromIDList(PIDL, DesktopDirectory); 
 LinkName:='\'+LinkName+'.lnk'
 LinkFileName := DesktopDirectory+LinkName; 
 tmpPFile.Save(pWChar(LinkFilename),FALSE); 
end;


Fritz the Cat - Mo 06.06.05 00:17

Ja, werd's probieren. Danke an alle! Werde erst mal Luckie's Guide(code) versuchen zu "verbauen". Die Antwort auf meiner Frage steht ja schon in seinem Code! Notfalls werde ich wohl doch mehr oder weniger auf InstallShield, InnoSetup und Konsorten zurück greifen müssen! Genau das wollte ich nicht.

Es liegt zwar bei meiner Delphi-Version das InstallShield bei, nur leider kann ich dort keine Aktionen definieren, die nach Beendigung der Installation auszuführen sind. InstallShield als eigenständige Version kann ich mir leider nicht leisten! :cry:


Delete - Mo 06.06.05 01:12

Mathias hat dir doch ein empfohlen, was genau das kann, was du suchst.


Fritz the Cat - Mo 06.06.05 01:29

Ja Micha, Danke. Habe mich jetzt erstmalig in Inno-Setup versucht. Und was soll ich Dir sagen. Es war eine Pleite. Aber ich habe noch sämtliche Versuche!


Delete - Mo 06.06.05 02:32

Was soll ich dazu sagen? mathias hat auf seiner Homepage extra ein Tutorial dafür: http://www.simmack.de/developer/doku/inno.shtml


Tino - Mo 06.06.05 08:38

Hallo Fritz the Cat und :welcome: hier im Delphi-Forum.de!

Die Verwendung von Suche im MSDN SHGETSPECIALFOLDERLOCATION wird auch hier im Forum in der FAQ erklärt: ...wie kann ich spezielle Ordner finden? [http://www.delphi-forum.de/viewtopic.php?t=9428&highlight=shgetspecialfolderlocation].

Bitte vor dem erstellen eines Topics suchen. ;-) Danke!

Gruß
Tino