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.