Honestamente, creo que la mejor manera es también la más básica, que es poner un acceso directo en Menú Inicio > Inicio del usuario.
Esto es por tres cosas.
1) El usuario sabe qué se está corriendo al inicio.
2) Es fácil de borrar.
3) No te metés con el registry, cosa que puede ser peligrosa si uno no tiene cuidado.
Es uno opinión, nada más.
Código Delphi
[-]
uses ShlObj, ComObj, ActiveX;
function RutaCarpetaEspecial(Carpeta: Cardinal): string;
var path: array [0..MAX_PATH] of char;
begin
ShGetSpecialFolderPath(0,@path[0],Carpeta,false) ;
Result:= path;
end;
procedure CreaLnk(Exe, Argumentos, DirTrabajo, NombreLnk, DirDestino: string);
var Objeto: IUnknown;
UnSlink: IShellLink;
FicheroP: IPersistFile;
WFichero: WideString;
begin
Objeto := CreateComObject(CLSID_ShellLink);
UnSlink := Objeto as IShellLink;
FicheroP := Objeto as IPersistFile;
with UnSlink do
begin
SetArguments( PChar(Argumentos) );
SetPath( PChar(Exe) );
SetWorkingDirectory( PChar(DirTrabajo) );
end;
WFichero := DirDestino + '\' + NombreLnk + '.lnk';
FicheroP.Save(PWChar(WFichero),False);
end;
procedure TForm1.btn1Click(Sender: TObject);
begin
CreaLnk( Application.ExeName,
'',
ExtractFilePath(Application.ExeName),
'Mi programa',
RutaCarpetaEspecial(CSIDL_STARTUP));
end;