Probé tu código "levemente modificado", y funciona:
Código:
procedure TForm1.Button1Click(Sender: TObject);
var
AComObject: IUnknown;
APersistFile: IPersistFile;
begin
AComObject := CreateComObject(CLSID_ShellLink);
with AComObject as IShellLink do
begin
OleCheck(SetArguments(''));
OleCheck(SetPath('C:\WINDOWS\CALC.EXE'));
OleCheck(SetWorkingDirectory('C:\WINDOWS'));
{Para que tome el ícono por Default}
//OleCheck(SetIconLocation(nil, 0));
{Para Otro ícono}
OleCheck(SetIconLocation('C:\WINDOWS\Moricons.dll', 10));
end;
AComObject.QueryInterface(IPersistFile, APersistFile);
APersistFile.Save('C:\ACCESO DIRECTO.LNK', False);
end;
Supongo que si pones SetIconLocation(nil, X)... tomará el ícono X del exe del SetPath!
Saludos!