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.

Foi útil?

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\

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top