How to create a file shortcut (*.lnk file) on desktop in Windows?

前端 未结 3 2213
清歌不尽
清歌不尽 2021-02-08 03:39
function GetDesktopFolder: string;
var
  buf: array[0..MAX_PATH] of Char;
  pidList: PItemIDList;
begin
  Result := StrNoDesktopFolderFo;
  SHGetSpecialFolderLocation(Ap         


        
相关标签:
3条回答
  • 2021-02-08 04:01
    uses ShlObj, ActiveX, ComObj;
    ...
    procedure TForm1.Button1Click(Sender: TObject);
    var
    IObject : IUnknown;
    ISLink : IShellLink;
    IPFile : IPersistFile;`enter code here`
    PIDL : PItemIDList;
    InFolder : array[0..MAX_PATH] of Char;
    TargetName : String;
    LinkName : WideString;
    begin
    TargetName := 'C:\Windows\System32\calc.exe';
    
    {Use TargetName:=ParamStr(0) which
    returns the path and file name of the
    executing program to create a link to your
    Application}
    
    IObject := CreateComObject(CLSID_ShellLink);
    ISLink := IObject as IShellLink;
    IPFile := IObject as IPersistFile;
    
    with ISLink do begin
    SetPath(pChar(TargetName));
    SetWorkingDirectory
    (pChar(ExtractFilePath(TargetName)));
    end;
    
    // if we want to place a link on the Desktop
    SHGetSpecialFolderLocation
    (0, CSIDL_DESKTOPDIRECTORY, PIDL);
    SHGetPathFromIDList
    (PIDL, InFolder);
    
    {
    or if we want a link to appear in
    some other, not-so-special, folder:
    InFolder := 'c:\SomeFolder'
    }
    
    LinkName := InFolder + '\Delphi Created Link.lnk';
    IPFile.Save(PWChar(LinkName), false);
    end;
    

    Source :[http://www.delphipages.com/forum/showthread.php?t=46623][1]

    0 讨论(0)
  • 2021-02-08 04:07

    Functions for obtaining special folder locations, creating shortcuts (links), and much much more can be found in the freeware dsiWin32 library of 100+ procedures and functions. Download it at http://gp.17slon.com/gp/dsiwin32.htm and thanks to Primoz Gabrijelcic and the Delphi-SI community for making it available.

    Max

    0 讨论(0)
  • 2021-02-08 04:10

    I would do it e.g. this way

    uses
      ShlObj, ComObj, ActiveX;
    
    function GetDesktopFolder: string;
    var
      PIDList: PItemIDList;
      Buffer: array [0..MAX_PATH-1] of Char;
    begin
      Result := '';
      SHGetSpecialFolderLocation(Application.Handle, CSIDL_DESKTOP, PIDList);
      if Assigned(PIDList) then
        if SHGetPathFromIDList(PIDList, Buffer) then
          Result := Buffer;
    end;
    
    function CreateDesktopShellLink(const TargetName: string): Boolean;
    var
      IObject: IUnknown;
      ISLink: IShellLink;
      IPFile: IPersistFile;
      PIDL: PItemIDList;
      LinkName: string;
      InFolder: array [0..MAX_PATH-1] of Char;
    begin
      Result := False;
    
      IObject := CreateComObject(CLSID_ShellLink);
      ISLink := IObject as IShellLink;
      IPFile := IObject as IPersistFile;
    
      with ISLink do
      begin
        SetDescription('Description ...');
        SetPath(PChar(TargetName));
        SetWorkingDirectory(PChar(ExtractFilePath(TargetName)));
      end;
    
      SHGetSpecialFolderLocation(0, CSIDL_DESKTOPDIRECTORY, PIDL);
      SHGetPathFromIDList(PIDL, InFolder) ;
    
      LinkName := IncludeTrailingBackslash(GetDesktopFolder);
      LinkName := LinkName + ExtractFileName(TargetName) + '.lnk';
    
      if not FileExists(LinkName) then
        if IPFile.Save(PWideChar(LinkName), False) = S_OK then
          Result := True;
    end;
    
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      if CreateDesktopShellLink('C:\Folder\ExeFile.exe') then
        ShowMessage('Link has been created ...');
    end;
    
    0 讨论(0)
提交回复
热议问题