Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Detectar trayecto de instalación de LibeOffice (https://www.clubdelphi.com/foros/showthread.php?t=96435)

rretamar 09-10-2023 13:34:08

Detectar trayecto de instalación de LibreOffice
 
Hola colegas pascaleros.


¿ Conocer alguna manera de averiguar si una aplicación está instalada (la opción "programas y características" del Panel de Control) pero que funcione si que nuestro ejecutable tenga privilegios de administrador ? En el registro hay una lista de software instalado, pero si no estoy ejecutando mi software como administrador no la puede leer. En particular es para detectar el trayecto de lnstalación de la suite LibreOffice, que la utilizo desde línea de comandos (en modo no-interactivo / invisible) para convertir archivos RTF o DOC hacia el formato PDF, con la ventaja de que puedo firmar los archivos con un certioficado. La versión de 64 bits por defecto se instala en C:\Program Files\LibreOffice\program ,igual estaba viendo de poder obtener este trayecto.

Saludos.

lucho6007 09-10-2023 16:29:15

Hola!
No se si ya pudiste resolver el problema, pero en Delphi podés usar la siguiente función:
Código Delphi [-]
function MyShellFindExecutable(const aFileName: string): string;
var
  Buffer: array[0..MAX_PATH] of Char;
begin
  Result := '';
  FillChar(Buffer, SizeOf(Buffer), #0);
  if (SHELLAPI.FindExecutable(PChar(aFileName), nil, Buffer) > 32) then
    Result := Buffer;
end;

Si le pasas un nombre de archivo válido, te devuelve el archivo asociado. Si buscás por un .DOC y lo tenés ascociado a LibreOffice, te va a devolver la ubicación del exe que abre los .DOC.
Hay que agregar ShellAPI a la lista de unidades del uses.


¡Espero te sirva!

rretamar 10-10-2023 06:23:25

Cita:

Empezado por lucho6007 (Mensaje 552882)
Hola!
No se si ya pudiste resolver el problema, pero en Delphi podés usar la siguiente función:
Código Delphi [-]function MyShellFindExecutable(const aFileName: string): string; var Buffer: array[0..MAX_PATH] of Char; begin Result := ''; FillChar(Buffer, SizeOf(Buffer), #0); if (SHELLAPI.FindExecutable(PChar(aFileName), nil, Buffer) > 32) then Result := Buffer; end;


Si le pasas un nombre de archivo válido, te devuelve el archivo asociado. Si buscás por un .DOC y lo tenés ascociado a LibreOffice, te va a devolver la ubicación del exe que abre los .DOC.
Hay que agregar ShellAPI a la lista de unidades del uses.


¡Espero te sirva!

Hola.
No necesitaría saber el ejecutavble asociado a una extensión, lo que necesito es saber el trayecto de instalación de LibreOffice, o poder consultar una lista de los programas instalados para buscar el libreoffice y obtener de alguna manera el trayecto.

Atte. Ramon

Casimiro Notevi 10-10-2023 15:06:03

Para obtener la ruta de instalación de otro programa utilizando Delphi, generalmente necesitarás buscar en el registro de Windows donde se suelen almacenar las rutas de instalación de las aplicaciones. Aquí te muestro cómo hacerlo:
  1. Accede al registro de Windows: Utiliza las funciones de la unidad Registry para acceder al registro de Windows.
  2. Encuentra la clave del registro del programa: Busca la clave del registro correspondiente al programa cuya ruta de instalación deseas obtener. La ubicación de esta clave puede variar según el programa. Generalmente, se encuentra en la ruta HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Uninstall o en HKEY_LOCAL_MACHINE\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall en sistemas de 64 bits.
  3. Lee el valor de la clave de instalación: Una vez que encuentres la clave del programa, lee el valor de la entrada del registro que contiene la ruta de instalación.
Aquí tienes un ejemplo básico en Delphi para obtener la ruta de instalación de un programa específico a partir de su clave de registro:
Código Delphi [-]
unit MainForm;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Registry;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Memo1: TMemo;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
  Reg: TRegistry;
  ProgramName: string;
begin
  // Especifica el nombre del programa cuya ruta deseas obtener
  ProgramName := 'NombreDelPrograma';

  Reg := TRegistry.Create;
  try
    Reg.RootKey := HKEY_LOCAL_MACHINE;
    if Reg.OpenKeyReadOnly('Software\Microsoft\Windows\CurrentVersion\Uninstall\' + ProgramName) then
    begin
      if Reg.ValueExists('InstallLocation') then
        Memo1.Lines.Add('Ruta de instalación de ' + ProgramName + ': ' + Reg.ReadString('InstallLocation'))
      else
        Memo1.Lines.Add('No se encontró la ruta de instalación para ' + ProgramName);
    end
    else
      Memo1.Lines.Add('No se encontró información en el registro para ' + ProgramName);
  finally
    Reg.Free;
  end;
end;

end.
Este ejemplo asume que estás buscando la ruta de instalación de un programa específico llamado "NombreDelPrograma". Asegúrate de reemplazar este nombre con el nombre real del programa que estás buscando. El código abrirá el registro en la ubicación comúnmente usada para programas instalados y buscará la clave del programa especificado. Luego, leerá el valor de la clave 'InstallLocation' para obtener la ruta de instalación.

rretamar 11-10-2023 06:46:48

Gracias Casimito. El problema que tengo es que no puedo acceder HKEY_LOCAL_MACHINE si el usuario que ejecuta el software no tiene privilegios de administrador.

rretamar 14-10-2023 22:38:12

Al final como no encontré una manera de detectar ese trayecto sin tener privilegios de administrador, agregué un campo en la tabla de configuración donde especifico el trayecto manualmente.


La franja horaria es GMT +2. Ahora son las 01:59:43.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi