Como posso obter o Nome de um Programa associado a uma extensão de arquivo utilizando Delphi?
-
24-09-2019 - |
Pergunta
Eu precisa para obter o nome do programa que está atualmente associado com uma extensão de arquivo para o usuário atual.Se você clique com o botão direito do mouse em um arquivo e escolha propriedades, em seguida, o que eu preciso é o nome do programa que está à direita da "Abre com" de linha.
exemplo:Para ".xls", eu quero ser capaz de obter a resposta "Microsoft Office Excel", ou qualquer programa que o usuário tem como seu programa padrão para abrir .arquivos xls.
Eu determinei que não é tão fácil como apenas indo em HKEY_CLASSES_ROOT e pegá-la para fora, pois ela também pode ser especificada em HKEY_LOCAL_MACHINE ou HKEY_CURRENT_USER ou HKEY_USERS.
Talvez tudo o que eu preciso saber é a ordem do grid utilizado pelo Windows para determinar isso e como chegar a cada um dos locais.É claro que, uma chamada de API do Windows para fazer isso seria o ideal.
Esta é uma pergunta semelhante a:Como obter ícone e descrição de extensão de arquivo utilizando Delphi? mas que pergunta respondida como obter a descrição da extensão e o ícone do programa associado.Eu não conseguia encontrar uma maneira de estender isso para também obter o nome do programa associado.
Eu estou usando Delphi 2009 e precisa de uma solução que funciona em Windows XP, Vista e 7.
Obrigado a todos por suas respostas.
Parece a minha crença de que o nome do executável não está no Registro depois de tudo.E depois de olhar ao redor, extensivamente, uma API do Windows que irá dar o nome, que eu não poderia encontrar um.
Eu acho que Mef a resposta, então, é o melhor.Para obter o nome do executável a partir das informações contidas no executável do programa.
Solução
Passo 1
Obter o executável que é atribuído para uma extensão de ficheiro, por exemplo, a seguinte função:
uses Registry, Windows, SysUtils;
function GetAssociation(const DocFileName: string): string;
var
FileClass: string;
Reg: TRegistry;
begin
Result := '';
Reg := TRegistry.Create(KEY_EXECUTE);
Reg.RootKey := HKEY_CLASSES_ROOT;
FileClass := '';
if Reg.OpenKeyReadOnly(ExtractFileExt(DocFileName)) then
begin
FileClass := Reg.ReadString('');
Reg.CloseKey;
end;
if FileClass <> '' then begin
if Reg.OpenKeyReadOnly(FileClass + '\Shell\Open\Command') then
begin
Result := Reg.ReadString('');
Reg.CloseKey;
end;
end;
Reg.Free;
end;
(Ver aqui, ou marc_s' responde a esta questão :-)
Passo 2
Agora você pode ler o nome do programa a partir de informações sobre a versão do executável!A maneira mais fácil é usando o TVersionInfo classe que você pode encontrar através do Google, por exemplo, aqui.
var VersionInfo: TVersionInfo;
VersionInfo := TVersionInfo.Create('PathToExe\name.exe');
s := VersionInfo.KeyValue['Description'];
No entanto, você tem que estar ciente de que alguns programas usam a chave de descrição, por isso (como o RAD Studio próprio ou MS Excel), enquanto outros usam o nome do produto chave...
Outras dicas
Não vá espalhar no registro quando houver funções da API projetadas para fazer o que você precisa.
No seu caso, você quer AssocQueryString
. Você pode dar a extensão do nome do arquivo e informará ao seu programa registrado para lidar com essa extensão (AssocStr_Executable
). Se você está planejando corrida Esse programa para abrir um documento, você realmente desejará a sequência de comando em vez de apenas o executável; AssocQueryString
pode dar isso a você também (AssocStr_Command
). Também pode dizer o tipo de documento como o que é exibido no Windows Explorer, como "Documento de texto" ou "Arquivo Zip" (AssocStr_FriendlyDocName
).
Essa função da API é um invólucro para o IQueryAssociations
interface. Se você está procurando programas de muitos tipos de arquivos ou muitas seqüências associadas a um único tipo, pode instanciar essa interface e reutilizá-lo em vez de chamar a função da API repetidamente.
O Delphi vem com uma unidade Shellapi.PAS usada no código de amostra abaixo. O arquivo precisa existir.
Veja como usá -lo:
function MyShellFindExecutable(const aFileName: string): string;
var
Buffer: array[0..WINDOWS.MAX_PATH] of Char;
begin
Result := '';
FillChar(Buffer, SizeOf(Buffer), #0);
if (SHELLAPI.FindExecutable(PChar(aFileName), nil, Buffer) > 32) then
Result := Buffer;
end;
no painel de administração,
i) goto gerenciar produtos
II) e selecione os produtos que não estão sendo exibidos no frontend Em seguida, selecione os atributos de atualização na ação
iv) então adicione esses produtos para corrigir sites.
Re-indexar os produtos do catálogo.
Espero que isso ajude você.
Que tal este artigo aqui: Determinando a aplicação associada
No caso concreto do Excel, você encontrará o .xls
Extensão sob HKEY_CLASSES_ROOT - O valor padrão dessa entrada é Excel.Sheet.8
.
Quando você vai procurar por Excel.Sheet.8
Novamente em hkey_classes_root, você encontrará uma entrada com um valor padrão de Microsoft Office Excel 97-2003 Worksheet
- Provavelmente é o melhor possível.
Se o usuário disser "use este aplicativo sempre" para .xls-arquivos, a informação é armazenada em
HK_CU\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.xls
A chave possui uma entrada "Aplicativo" contendo o nome do aplicativo (por exemplo, "soffice.exe"). Está correlacionado com uma chave de aplicação em hk_cr, por exemplo HK_CR\Applications\soffice.exe\