es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Cómo cambiar la ruta del acceso directo sin actualizar el icono?

Tengo el siguiente código que cambia la ruta de un acceso directo. Sucede que cuando la ruta se cambia, el icono también se actualiza al icono de la nueva aplicación.

¿Cómo cambiar la ruta sin actualizar el icono del acceso directo?

Utiliza:

ActiveX, ComObj, ShlObj;

function GetDesktopFolder: string;
var
buf: array[0..MAX_PATH] of Char;
pidList: PItemIDList;
begin
Result := ”;
SHGetSpecialFolderLocation(Application.Handle, CSIDL_DESKTOP, pidList);
if (pidList <> nil) then
if (SHGetPathFromIDList(pidList, buf)) then
Result := buf;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
MyObject: IUnknown;
MySLink: IShellLink;
MyPFile: IPersistFile;
LnkPath, sExePath, sParams: string;
begin
sParams := ”;
sExePath := ‘C:\Program Files\Google\Chrome\Application\chrome.exe’;
LnkPath := GetDesktopFolder + ‘\Target.lnk’;
MyObject := CreateComObject(CLSID_ShellLink);
MySLink := MyObject as IShellLink;
MyPFile := MyObject as IPersistFile;

with MySLink do
begin
SetDescription(”);
SetPath(PWideChar(sExePath));
SetArguments(PWideChar(sParams));
SetWorkingDirectory(PWideChar(ExtractFilePath(sExePath)));
SetIconLocation(PWideChar(”), 0);
end;

MyPFile.Save(PWChar(WideString(LnkPath)), False);
SHChangeNotify(SHCNE_UPDATEITEM, SHCNF_PATH, PWideChar(LnkPath), nil);
end;

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para cambiar la ruta de acceso de un acceso directo sin actualizar su icono, debe eliminar la línea que llama al método SetIconLocation de la interfaz IShellLink. Esta línea establece la ubicación del icono en una cadena vacía, lo que hace que el acceso directo utilice el icono predeterminado de la nueva aplicación. Al eliminar esta línea, el acceso directo conservará su icono original.

    Aquí está el código actualizado sin la línea SetIconLocation:

    procedure TForm1.Button1Click(Sender: TObject);
    var
      MyObject: IUnknown;
      MySLink: IShellLink;
      MyPFile: IPersistFile;
      LnkPath, sExePath, sParams: string;
    begin
      sParams := '';
      sExePath := 'C:\Program Files\Google\Chrome\Application\chrome.exe';
      LnkPath := GetDesktopFolder + '\Target.lnk';
      MyObject := CreateComObject(CLSID_ShellLink);
      MySLink := MyObject as IShellLink;
      MyPFile := MyObject as IPersistFile;
    
      with MySLink do
      begin
        SetDescription('');
        SetPath(PWideChar(sExePath));
        SetArguments(PWideChar(sParams));
        SetWorkingDirectory(PWideChar(ExtractFilePath(sExePath)));
      end;
    
      MyPFile.Save(PWChar(WideString(LnkPath)), False);
      SHChangeNotify(SHCNE_UPDATEITEM, SHCNF_PATH, PWideChar(LnkPath), nil);
    end;
    

Comments are closed.