Pregunta

Necesito obtener el nombre del programa asociado actualmente con una extensión de archivo para el usuario actual.Si hace clic derecho en un archivo y selecciona propiedades, entonces lo que necesito es el nombre del programa que está a la derecha de la línea "Se abre con".

p.ej.Para ".xls", quiero poder obtener la respuesta "Microsoft Office Excel", o cualquier programa que el usuario tenga como programa predeterminado para abrir archivos .xls.

He determinado que no es tan fácil como entrar en HKEY_CLASSES_ROOT y seleccionarlo, ya que también puede especificarse en HKEY_LOCAL_MACHINE o HKEY_CURRENT_USER o HKEY_USERS.

Quizás todo lo que necesito saber es el orden jerárquico utilizado por Windows para determinar esto y cómo llegar a cada una de las ubicaciones.Por supuesto, lo ideal sería una llamada a la API de Windows para hacer esto.

Esta es una pregunta similar a:¿Cómo obtener el ícono y la descripción de la extensión de archivo usando Delphi? pero esa pregunta solo respondió cómo obtener la descripción de la extensión y el ícono del programa asociado.No pude encontrar una manera de extender eso para obtener también el nombre del programa asociado.

Estoy usando Delphi 2009 y necesito una solución que funcione en Windows XP, Vista y 7.


Gracias a todos por sus respuestas o comentarios.

Parece que creo que, después de todo, el nombre del ejecutable no está en el Registro.Y después de buscar detenidamente una API de Windows que diera el nombre, no pude encontrar ninguna.

Creo que la respuesta de Mef es la mejor.Obtener el nombre del ejecutable a partir de la información incluida en el ejecutable del programa.

¿Fue útil?

Solución

Paso 1

Obtener el ejecutable que se asigna a una extensión de archivo, por ejemplo, con la siguiente función:

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;

(Véase aquí , anwser o marc_s' a esta pregunta: - )

Paso 2

Ahora se puede leer el nombre del programa a partir de la información de versión de este ejecutable! La forma más fácil es usar la clase TVersionInfo se puede encontrar a través de Google, por ejemplo aquí .

var VersionInfo: TVersionInfo;  
VersionInfo := TVersionInfo.Create('PathToExe\name.exe');  
s := VersionInfo.KeyValue['Description'];

Sin embargo, hay que tener en cuenta que algunos programas usan la tecla descripción, por lo tanto (como sí o MS Excel RAD Studio), mientras que otros utilizan la clave nombre del producto ...

Otros consejos

No vaya espeleología en el Registro cuando hay funciones API diseñadas para hacer lo que necesita.

En su caso, usted quiere AssocQueryString . Se le puede dar la extensión de nombre de archivo, y le dirá que su programa registrado para manejar esa extensión (AssocStr_Executable). Si usted está pensando en ejecutar que programa para abrir un documento, entonces usted realmente desea la cadena de comandos en lugar de sólo el ejecutable; AssocQueryString le puede dar eso también (AssocStr_Command). También le puede decir el tipo de documento, como lo que se muestra en el Explorador de Windows, como "Documento de texto" o "Zip" (AssocStr_FriendlyDocName).

Esa función de la API es un contenedor para el IQueryAssociations interfaz. Si usted está buscando para los programas de muchos tipos de archivos, o porciones de las cadenas asociadas a un solo tipo, es posible que desee crear una instancia de esa interfaz y la reutilización en lugar de llamar a la función API de una y otra.

Delphi viene con una unidad de ShellApi.pas que se utiliza en el código de ejemplo a continuación. El archivo tiene que existir.

Así es como se usa:

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;

Creo que es necesario combinar las respuestas de Mef y Rob Kennedy.

Tome la respuesta de Rob Kennedy y siga el paso 2 de la respuesta de Mef.Leer el registro directamente no es algo bueno, por lo que debes desechar su parte 1.

Pero no busco el nombre descriptivo del tipo de archivo.

AssocQueryString devuelve no solo un nombre descriptivo para el tipo de archivo (ASSOCSTR_FRIENDLYDOCNAME), pero también puede devolver el nombre del ejecutable al archivo abierto (ASSOCSTR_EXECUTABLE) - Esto es lo que necesitas.

Incluso más que eso:No estoy seguro, pero puede ser ASSOCSTR_FRIENDLYAPPNAME coincidirá con sus necesidades.En ese caso, puede utilizar únicamente la respuesta de Rob Kennedy.

El problema al leer el registro directamente es que puede devolver información incorrecta.Esto se debe a que usted lee la configuración del sistema; eso es lo que registró la aplicación.Pero el usuario puede anular esto.Por ejemplo, puede hacer clic derecho en .xls y seleccionar "Abrir con ..." -> "Otra aplicación". -> "OpenOffice" -> "Use esta aplicación siempre".La información de registro para el tipo .xls no se modificará (las preferencias del usuario se guardan en un lugar separado, por lo que las aplicaciones no pueden alterarlas), por lo que su código (que lee el registro directamente) continuará produciendo "MS Excel", aunque cuando el usuario hace doble clic en el archivo: se iniciará OpenOffice.

¿Qué hay de este artículo aquí: La determinación de la aplicación asociada

En el caso concreto de Excel, se dará cuenta de la extensión .xls en HKEY_CLASSES_ROOT -. El valor predeterminado de esa entrada es Excel.Sheet.8

Cuando vaya buscar Excel.Sheet.8 de nuevo en HKEY_CLASSES_ROOT, encontrará una entrada con un valor predeterminado de Microsoft Office Excel 97-2003 Worksheet - que es probablemente tan bueno como se pone.

Si el usuario dice "utilizar esta aplicación siempre" de .xls-archivos de la información almacenada en ist

HK_CU\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.xls

La llave tiene una entrada "Aplicación" que contiene el nombre de la aplicación (por ejemplo "soffice.exe"). Se correlaciona con una clave Applcication en HK_CR, por ejemplo, HK_CR\Applications\soffice.exe\

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top