Archivo

Archivo para la categoría ‘Windows’

II – «Registros» de una DLL de previsualización (PreviewHandler)

miércoles, 22 de mayo de 2024 Sin comentarios
Share Button

INTRODUCCIÓN

Continuando el tema de «Crear una Previsualización de ficheros en Windows», vamos a seguir completando esta serie, haciendo referencia al tema del registro que nos quedó pendiente en la anterior entrada.
Os adjunto los links de todas las entradas de esta serie, que iré completando a medida que avance:

  1. Crear una Previsualización de ficheros en Windows
  2. «Registros» de una DLL de previsualización
  3. Generando previsualización funcional (PreviewHandler)

 

Hablo de «registros» en el título de esta entrada, porque vamos a abordar por un lado, los cambios en el «registro de Windows» que debemos realizar para que nuestra DLL quede «inscrita» en el sistema (con esto le decimos al sistema, que cuando quiera visualizar un determinado fichero de extensión AAA, debe cargar nuestra DLL para mostrar ese contenido). Y en segundo lugar, veremos cómo registrar nuestra DLL en Windows a través de regsrv32.

.

CLAVES DE REGISTRO

Cuando registramos nuestra DLL (regsvr32) necesitamos modificar algunos valores en el registro de Windows para indicar al sistema que tiene una DLL disponible para utilizar cuando se le solicite una vista previa de un archivo con extensión AAA.
Para ello tenemos disponible esta documentación que explica los diferentes cambios a crear/borrar cuando realizamos el register/unregister.

https://learn.microsoft.com/en-us/windows/win32/shell/how-to-register-a-preview-handler
https://learn.microsoft.com/es-es/windows/win32/shell/how-to-register-a-preview-handler

Lo primero que debemos tener en cuenta, es que si nuestro controlador de Vista previa (de 32 bits) se está registrando en un sistema de 64 bits, tal y como se describe aquí, debe usar un IdApp diferente;

En caso de un sistema de 32 bits usaremos este:

AppId = {6d2b5079-2f0b-48dd-ab7f-97cec514d30b}

Y en el caso de un sistema de 64 bits usaremos este otro:

AppId = {534A1E02-D58F-44f0-B58B-36CBED287C7C}

Extensión del archivo

Lo primero es registrar la extensión del archivo que queremos visualizar. Para ello usamos las siguientes claves:

   Equipo\HKEY_CLASSES_ROOT\.aaa (Extensión)
   Equipo\HKEY_CLASSES_ROOT\aaaFile (ProgID asociado a la extensión)

Donde aaa es la extensión que queremos registrar.

Controlador de Vista previa

Una vez registrada la extensión, hay que registrar la DLL que queremos asociar a esa extensión para visualizarla.
Para ello utilizaremos la subclave dentro de CLSID con los datos del controlador. El detalle de los valores los podéis ver aquí.

   Equipo\HKEY_CLASSES_ROOT\CLSID
   (Equipo\HKEY_CLASSES_ROOT\WOW6432Node\CLSID)

 

Lista de controladores

Finalmente hay que añadir el controlador a la lista de controladores instalados en el sistema. Es un valor redundante, pero es una optimización que el sistema usa para enumerar todos los controladores de vista previa registrados con fines de visualización.

   Equipo\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\PreviewHandlers

.

REGISTRO DE LA DLL

Una vez compilada la  DLL, debemos registrarla en Windows utilizando la herramienta regsvr32.

Para registrar la DLL podemos ejecutar este comando desde el directorio de la DLL (permisos de Administrador):

regsvr32 Nombre_de_la_DLL.dll

Para desregistrarla utilizamos el mismo comando, pero con el parámetro /u:

regsvr32 /u Nombre_de_la_DLL.dll

.

PROBANDO EL PROYECTO

Os adjunto más abajo un ZIP con todos los ficheros del proyecto. Está todo lo necesario para compilarlo, registrar una extensión y probar que la DLL está funcionando.

Recordar que, por ahora, nuestra DLL sólo muestra un formulario vacío (botón y memo), no muestra ninguna previsualización, pero este esqueleto está pensado para comprobar que la estructura funciona correctamente. Más adelante añadiremos código funcional.

En la unit uConstantes.pas tenéis unas mínimas constantes necesarias. En concreto está la única que debéis cambiar si queréis que vuestro proyecto funcione con un tipo de fichero diferente.

  // NOTA: sólo cambiando esta constante podemos registrar otra extensión diferente
  const
    EXTENSION_FICHERO_SIN_PUNTO = 'ccc';

La unit uRegister.pas tiene todo lo necesario para añadir y eliminar del registro la claves y valores que hemos comentado antes.

Tenemos el uPreviewForm donde se define el formulario básico que se mostrará en la previsualización.

Y la unit uPreviewHandler.pas que realmente es la importante por ahora que posee toda la «chicha» del visualizador. Está bastante comentada (y la vimos en detalle en la primera entrada de esta serie), así que si algo no ha quedado claro podéis revisarla y revisar los comentarios que incluye.

Os adjunto los siguientes ficheros:

En este proyecto he usado la extensión de fichero CCC. De forma que podéis probarla con este tipo de ficheros.

El proyecto incluye los ficheros .BAT para registrar/desregistrar la DLL. Basta que estén en el mismo directorio y lo ejecutéis con permisos de Administrador.

Primer video mostrando el registro y funcionamiento de nuestra DLL

Categories: Código, DLL, Ejemplos, Windows Tags: , , ,

Delphi 12 Athens; Tratamiento de aplicaciones MDI

jueves, 4 de abril de 2024 Sin comentarios
Share Button

Interfaz MDI

Aunque seguro que no es una de las características más utilizadas hoy en día en los programas nuevos desarrollados en Delphi, es probable que tengamos programas antiguos que funcionan con esta interfaz de usuario. Yo mismo tengo alguno que todavía la usa.

Hasta ahora migrar esos programas a versiones nuevas podía ser un problema debido a que Microsoft ha declarado MDI como obsoleta y el funcionamiento no acaba de de ser el correcto. Problemas con el repintado, los estilos y con High DPI entre otros.

Para la versión 12 de Delphi se ha intentado solventar estos problemas implementando la solución desde el propio Delphi y no dejando que lo solvente Windows. El resultado no sólo es, que ahora ya podemos recompilar nuestras aplicaciones antiguas con la versión 12 y volver a tener lo mismo que teníamos antes, sino que con esta modificación, el resultado puede ser «mejor» todavía que el que teníamos en la versión antigua.
¿Porqué esto último?
Porque además de implementar las características del MDI para que funcionen correctamente, se ha añadido un nuevo componente, que si lo utilizamos (no es obligatorio), las mejorará sobre todo a nivel visual y de usabilidad.

Leer más…