21 junio 2007

Crear un acceso directo

Aquí tenemos un pequeño pero interesante procedimiento para crear accesos directos en Windows. Antes de implementarlo hay que añadir en uses una serie de unidades externas:

uses
Windows, Dialogs, ..., ShlObj, ActiveX, StdCtrls, Registry, ComObj;

Este sería el procedimiento:

procedure CrearAccesoDirecto( sExe, sArgumentos, sDirTrabajo, sNombreLnk, sDirDestino: 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( sArgumentos ) );
SetPath( PChar( sExe ) );
SetWorkingDirectory( PChar( sDirTrabajo ) );
end;

WFichero := sDirDestino + '\' + sNombreLnk;
FicheroP.Save( PWChar( WFichero ), False );
end;

Y estos son sus parámetros:

sExe -> Ruta que apunta al ejecutable o archivo a crear el acceso directo
sArgumentos -> Parámetros que le mandamos al EXE
sDirTrabajo -> Ruta al directorio de trabajo del ejecutable
sNombreLnk -> Nombre del acceso directo
sDirDestino -> Ruta destino donde se creará el acceso directo

Aquí os muestro un ejemplo de cómo crear un acceso directo de la calculadora de Windows al escritorio:

procedure CrearAccesoCalculadora;
var
sEscritorio: String;
Registro: TRegistry;
begin
Registro := TRegistry.Create;

// Leemos la ruta del escritorio
try
Registro.RootKey := HKEY_CURRENT_USER;

if Registro.OpenKey( '\Software\Microsoft\Windows\CurrentVersion\explorer\Shell Folders', True ) then
sEscritorio := Registro.ReadString( 'Desktop' );
finally
Registro.CloseKey;
Registro.Free;
inherited;
end;

CrearAccesoDirecto( 'C:\Windows\System32\calc.exe', '',
'C:\Windows\System32\', 'Calculadora.lnk', sEscritorio );
end;

Pruebas realizadas en Delphi 7.

2 comentarios:

Unknown dijo...

Hola,
Con la nueva versión del S.O. Windows 7 no funciona la creación de los accesos directos.
O al menos a mi me ha dejado de funcionar.
Acabo de comprobar el valor de la variable sEscritorio que guarda el path del escritorio en el registro...
Debería ser en mi caso: c:\Users\Public\Desktop
y devuelve en su lugar...
C:\Windows\system32\config\systemprofile\Desktop
Buscando en c: ciertamente existe esta carpeta y allí estánn los accesos creados, pero luego estos accesos no aparecen en el escritorio.
Y finalmente, si a la variable: sEscritorio se le da el valor del path (c:\Users\Public\Desktop) entonces sí que funciona el acceso.
¿Se te ocurre una solución?
Un saludo
Julián

Gustavo D. Ochoa Paniagua dijo...

Hola como puedo saber si el acceso directo ya esta creado y no volver a crearlo

Publicidad