Programowanie w języku Delphi » FAQ

Jak utworzyć skrót do programu na pulpicie lub w menu start

  • 2008-07-23 13:29
  • 6 komentarzy
  • 3252 odsłony
  • Oceń ten tekst jako pierwszy
Funkcja często przydatna w instalatorach, które muszą utworzyć skrót do instalowanego programu na pulpicie lub np. w menu start. Taka opcja może być również wykorzystywana jako opcja dowolnego programu.

Należy zaznaczyć, że poniższe rozwiązanie nie zadziała w Delphi 2. Poniższy przykład prezentuje tworzenie skrótu do Notatnika na pulpicie oraz w menu start:

uses  ShlObj, ActiveX, ComObj, Registry;
 
procedure TForm1.Button1Click(Sender: TObject);
var  
  MyObject : IUnknown;
  MySLink : IShellLink; 
  MyPFile : IPersistFile;  
  FileName : String;
  Directory : String;  
  WFileName : WideString;  
  MyReg : TRegIniFile;
begin
  MyObject := CreateComObject(CLSID_ShellLink);
  MySLink := MyObject as IShellLink;  
  MyPFile := MyObject as IPersistFile;
  FileName := 'NOTEPAD.EXE';  
 
  with MySLink do 
  begin
   SetArguments('C:\AUTOEXEC.BAT'); 
   SetPath(PChar(FileName));
   SetWorkingDirectory(PChar(ExtractFilePath(FileName)));  
  end;
 
  MyReg := TRegIniFile.Create('Software\MicroSoft\Windows\CurrentVersion\Explorer');
 
  // Poniższe dodaje skrót do desktopu
  Directory := MyReg.ReadString('Shell Folders', 'Desktop', '');
  WFileName := Directory + '\Notatnik.lnk';
  MyPFile.Save(PWChar(WFileName), False);
 
  // A to do menu Start
  Directory := MyReg.ReadString('Shell Folders', 'Start Menu' ,'') + '\Microspace';
 
  CreateDir(Directory);
 
  WFileName := Directory + '\Notatnik.lnk';  
  MyPFile.Save(PWChar(WFileName), False);
  MyReg.Free;
end;

6 komentarzy

BoZzDoG 2009-09-16 17:03

Mam prostrze rozwiązanie. Napisałem moduł, dzięki któremu można w bardzo prosty sposób tworzyć skróty do plików (do katalogów pewnie też, ale nie sprawdzałem). Dwie przeciążone procedury obsługujące jedynie tworzenie skrótów bez parametrów, hotkey'ów itd.

Oto procedury:

procedure mkShellLink(FilePath: String; ShortcutPath: WideString); overload; stdcall;

ta procedura tworzy skrót w dowolnym miejscu na dysku, a jej parametrami są kompletna ścieżka do pliku, który będzie otwierany oraz kompletna ścieżka docelowa, w której zostanie owy skrót utworzony.

Przykład wywołania procedury:

mkShellLink('C:\Program Files\Program\App.exe', 'C:\Shortcut.lnk');


Druga procedura:

procedure mkShellLink(FilePath, ShortcutName: String; CSIDL_Folder: Byte); overload; stdcall;

ta procedura także tworzy skrót w dowolnym miejscu, jej parametrami są kompletna ścieżka do pliku, który będzie otwierany, nazwa skórtu oraz stała odpowiadająca specialnemu folderowi.

Przykład wywołania procedury:

mkShellLink('C:\Program Files\Program\App.exe', 'App.lnk', CSIDL_DESKTOP);

Procedura ta korzysta z SHGetSpecialFolderPath, tak że w miejsce trzeciego parametru można wpisywać wszystkie wartości odpowiadające stałym specialnych folderów. Nie trzeba deklarować modułu, dzięki któremu możliwe jest korzystanie z tych stałych, ponieważ stałe te są zadeklarowane w module. Jedyne co trzeba zrobić to dodać do listy modułów Shortcuts i wrzucić moduł Shortcuts.dcu do folderu Lib w głównym katalogu Delphi. Obie procedury działają w 100%.

Adres:
http://www.plikus.pl/zobacz_plik-Shortcuts-235057.html
Hasło:
www.4p.pl

Pozdrawiam.

programik3 2008-12-29 12:55

Ciekawe jaki ma typ PFile?
Teraz jest problem bo młot (autor) nie zamieścił deklaracji tej zmiennej :P

Damiaaaan 2007-01-20 22:28

Rady
Nie działa mi to co napisales na xp
wyskakuje mi blad przy PFile

Rady 2006-12-12 02:55

Zwracam honor dziła gdy dodamy :  
FileName := Kataloginstalacji+'program.exe';
  // set the link properties
MySLink.SetPath (PChar (FileName));
MySLink.SetWorkingDirectory (PChar ( ExtractFilePath (FileName)));


    WFileName := ExtractFilePath (FileName) +
    'Securfile.lnk';
    PFile.Save (PWChar (WFileName), False);
    Reg := TRegIniFile.Create( 'Software\MicroSoft\Windows\CurrentVersion\Explorer');
    WFileName := Reg.ReadString ('Shell Folders', 'Desktop', '') +
    '\program.exe';
    Reg.Free;
    MyPFile.Save (PWChar (WFileName), False);

Rady 2006-12-12 02:11

Po XP nie działa :(