Oto mój kod skopiowany z gotowców i trochę przerobiony. Zaznaczam, że działa poprawnie na
aplikacjach z "formą".
procedure SetShortening(FName: PChar; Where: string);
var
IObject : IUnknown;
ISLink : IShellLink;
IPFile : IPersistFile;
FileName : String;
WFileName : WideString;
begin
IObject := CreateComObject(CLSID_ShellLink); //przy ustawionych znacznikach w tym miejscu wywala błąd w konsolówce
ISLink := IObject as IShellLink;
IPFile := IObject as IPersistFile;
FileName:= pchar(string(FName));
with ISLink do
begin
SetPath(PChar(FileName));
SetWorkingDirectory(PChar(ExtractFilePath(FileName)));
end;
WFileName := Where + '' + ExtractFileName(ChangeFileExt(FileName, '.lnk'));
IPFile.Save(PWChar(WFileName), False); // zapisz lacznik
end;
Metody wywołania:
SetShortening(Pchar(string(paramStr(0))), 'C:\');
SetShortening(Pchar(string(application.exename)), 'C:\'); //w aplikacjach z formą to działa