II – «Registros» de una DLL de previsualización (PreviewHandler)
Contenido
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:
- Crear una Previsualización de ficheros en Windows
- «Registros» de una DLL de previsualización
- Generando previsualización funcional (PreviewHandler)
- Instalador para PreviewHandler de imágenes/texto (Inno Setup)
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:
- Todos los ficheros del proyecto (descargar)
- Ficheros de ejemplo (descargar)
- DLL compilada (descargar)
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
Embarcadero MVP.
Analista y Programador de Sistemas Informáticos.
Estudios de Informática (Ingeniería Técnica Superior) en la UPC (Universidad Politécnica de Barcelona).
Llevo utilizando Delphi desde su versión 3. Especialista en diseño de componentes, Bases de Datos, Frameworks de Persistencia, Integración Continua, Desarrollo móvil,…