Criando e excluindo atalhos do desktop

Técnicas de uso de interfaces

Olá amigos, neste artigo vamos aprender a incluir e excluir um atalho para um determinado arquivo/programa no desktop do Windows. Usaremos uma técnica bastante eficiente, porém pouco utilizada: Interfaces. Criaremos um objeto que faça uso das interfaces IShellLink, IUnknown e IPersistFile.

Entendendo as Interfaces

As interfaces são “entidades” dotadas de métodos e propriedades que deve ser utilizadas por uma classe. No Delphi encontramos diversas interfaces. Em outro artigo mostrei como atualizar o papel de parede do Windows instantaneamente usando a interface IActiveDesktop, que possui diversos métodos para manipulação do ActiveDesktop do S.O. Neste caso usaremos como base IShellLink, interface para manipulação de atalhos do tipo link (.lnk).

A primeira providência a se tomar é criar um objeto capaz de fazer referência a nossa interface. Para isso criaremos uma variável do tipo IUnknown e a instanciaremos fazendo uma chamada à CreateOleObject. Logo em seguida criaremos duas novas variáveis que receberão as informações de Diretório Inicial e Nome do Arquivo. Feito isso então salvamos o atalho no desktop.

Criando o atalho

Inicie um novo projeto e desenhe uma tela semelhante a Figura 1.

Figura 1. Tela de criação de atalhos

No corpo do projeto crie um procedimento usando o algoritimo do Quadro 1. Nele está contido o código fonte para a criação dos objetos e atribuição de valores para a criação do atalho.

 

procedure TForm1.CriarAtalho(ANomeArquivo, AParametros, ADiretorioInicial,

  ANomedoAtalho, APastaDoAtalho: string);

var

  MeuObjeto: IUnknown;

  MeuSLink: IShellLink;

  MeuPFile: IPersistFile;

  Diretorio: string;

  wNomeArquivo: WideString;

  MeuRegistro: TRegIniFile;

begin

  //Cria e instancia os objetos usados para criar o atalho

  MeuObjeto := CreateComObject(CLSID_ShellLink);

  MeuSLink := MeuObjeto as IShellLink;

  MeuPFile := MeuObjeto as IPersistFile;

  with MeuSLink do

  begin

    SetArguments(PChar(AParametros));

    SetPath(PChar(ANomeArquivo));

    SetWorkingDirectory(PChar(ADiretorioInicial));

  end;

  //Pega endereço da pasta Desktop do Windows

  MeuRegistro :=

    TRegIniFile.Create('Software\MicroSoft\Windows\CurrentVersion\Explorer');

  Diretorio := MeuRegistro.ReadString('Shell Folders', 'Desktop', '');

  wNomeArquivo := Diretorio + '\' + ANomedoAtalho + '.lnk';

  //Cria de fato o atalho na tela

  MeuPFile.Save(PWChar(wNomeArquivo), False);

  MeuRegistro.Free;

end;

 

Não podemos de nos esquecer que é necessário a declaração das units ShellApi, ShlObj, ActiveX, ComObj, Registry.

No evento onClick do botão “Criar o atalho” basta chamar o procedimento informando os parâmetros necessários: Nome do arquivo, Parâmetros, Diretório Inicial, Nome do atalho e pasta do atalho.

Excluindo o atalho

Para excluir o atalho basta criar um procedimento como o algoritimo da Quadro 2.

O único segredo neste algoritimo é o DeleteFile. Passamos para ele qual o nome do arquivo com endereço completo e ele se encarrega da exclusão do arquivo.

 

procedure TForm1.ApagarAtalho(FileName: string);

var

  Directory: string;

  WFileName: WideString;

  MyReg: TRegIniFile;

begin

  MyReg :=

    TRegIniFile.Create('Software\MicroSoft\Windows\CurrentVersion\Explorer');

  Directory := MyReg.ReadString('Shell Folders', 'Desktop', '');

  if FileExists(Directory + '\' + FileName) then

  begin

    if MessageDlg('Confirma a exclusão do atalho: ' + #13 +

      Directory + '\' + FileName, mtConfirmation, [mbYes, mbNo], 0) = mrYes then

      DeleteFile(Directory + '\' + FileName);

  end

  else

    MessageDlg('O atalho: ' + #13 + Directory + '\' + FileName + #13 +

      'não existe ou já foi excluído.',

      mtInformation, [mbOK], 0);

  MyReg.Free;

end;

 

No evento onClick do botão Apagar o atalho basta chamar o procedimento informando o parâmetro necessário: Nome do atalho.

Conclusões

O uso de interfaces facilita a criação de deteminadas tarefas que seu sistema deve desenvolver.