Inclua ActiveX, ComObj e ShlObj na clausula USES.

Para isso, a seguir temos os eventos do form codificados:


unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, 
Controls, Forms, Dialogs, ActiveX, ComObj, ShlObj, StdCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
DirDesktop: String;

implementation

procedure TFMain.FormCreate(Sender: TObject);
var ItemIDList :  PItemIDList;
begin
        SetLength(DirDesktop,MAX_PATH);
        SHGetSpecialFolderLocation(Application.Handle, 
                                   CSIDL_DESKTOPDIRECTORY,ItemIDList);
        SHGetPathFromIDList(ItemIdList,PChar(DirDesktop));
        SetLength(DirDesktop,StrLen(PChar(DirDesktop)));
end;

procedure TFMain.BitBtn1Click(Sender: TObject);
var ShellLink : IShellLink;
PersistFile : IPersistFile;
NomeLnk : WideString;
begin
        ShellLink := CreateComObject(CLSID_ShellLink) as IShellLink;
        PersistFile := ShellLink as IPersistFile;
        with ShellLink do begin
                // Informe o Título do ícone
                SetDescription(PChar('DESCRIÇÃO DO ATALHO'));

                // Informe o Caminho e o Arquivo
                SetPath(PChar('C:PASTAARQUIVO.EXE'));

                // Argumentos para linha de comando, caso existam
                SetArguments(PChar(''));
                
                // Informe o Caminho e o Arquivo
                SetWorkingDirectory(
                    PChar(ExtractFilePath('C:PASTAARQUIVO.EXE')));
        end;

        // Informe o nome do Atalho
        NomeLnk := DirDesktop + ' ' + 
                   ChangeFileExt('DESCRIÇÃO DO ATALHO','.lnk');
        PersistFile.Save(PWideChar(NomeLnk),False);
end;

Para ler os parâmetros contidos nos atalhos, como destino, "iniciar em" e etc., afim de corrigi-los ao ser chamado o executável, usamos o seguinte código:


IncludeTrailingPathDelimiter(ExtractFilePath(ParamStr(0))); 
//Pega a pasta do exe 
IncludeTrailingPathDelimiter(GetCurrentDir); 
//Pega a pasta do ícone ('Iniciar em')

Isso é muito útil para criar um arquivo .ini, por exemplo, numa rede interna podemos ter um único executável, o que facilita a atualização, já que os perfis de usuário (arquivo .ini) são gravados localmente (GetCurrentDir).

Nota: Essa dica foi enviada pelo nosso amigo Alvaro Vieira