Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Possuo uma aplicação em C# que precisa pegar para onde o atalho de um X programa aponta.
Ele funciona muito bem, até que seja selecionado um tipo de atalho especifico.
O codigo que uso para retornar o atalho é este:
public Shell32.Folder GetShell32NameSpaceFolder(Object folder)
{
Type shellAppType = Type.GetTypeFromProgID("Shell.Application");
Object shell = Activator.CreateInstance(shellAppType);
return (Shell32.Folder)shellAppType.InvokeMember("NameSpace",
System.Reflection.BindingFlags.InvokeMethod, null, shell, new object[] { folder });
}
public string[] GetShortcutDestination(string shortcutFilename)
{
string[] ret;
string pathOnly = Path.GetDirectoryName(shortcutFilename);
string filenameOnly = Path.GetFileName(shortcutFilename);
Shell32.Folder folder = GetShell32NameSpaceFolder(pathOnly);
Shell32.FolderItem folderItem = folder.ParseName(filenameOnly);
if (folderItem != null)
{
Shell32.ShellLinkObject link = (Shell32.ShellLinkObject)folderItem.GetLink;
ret = new string[] { link.Path, link.Arguments, link.WorkingDirectory };
}
else ret = new string[] { };
return ret;
}
Chamo a função GetShortcutDestination() passando o caminho do atalho. Me retorna o local do .exe, os argumentos e o local de execução.
Segue um print de um .lnk padrão e do que a função exibi:
Agora as propriedades de um .lnk e de oque a função exibi dele:
Esse caminho exibido até existe, porém este não é o caminho real do aplicativo. Se tenho executar esse .lnk pelo ProccessInfo, ele diz que o diretório não foi encontrado.
Alguem tem uma sugestão de como corrigir essa função para que ela funcione com esse "Outro tipo de atalho"??
Consegui resolver utilizando este tópico: https://astoundingprogramming.wordpress.com/2012/12/17/how-to-get-the-target-of-a-windows-shortcut-c/
Ele explica a diferença entre os atalhos em questão (normal e MSI) e da exemplo de uma classe que retorna o caminho correto da aplicação.
Acho que esse ink na verdade aponta pra assinatura do aplicativo dentro do sistema do Windows, tente procurar por esse ID dentro da lista de programas instalados.