Nueva pestaña a la Propiedades de Archivo en Windows

Iniciado por GaudyG, 29 Septiembre 2019, 16:57 PM

0 Miembros y 1 Visitante están viendo este tema.

GaudyG

Buenos días, estoy interesado en programar una nueva pestaña de la propiedad de archivos de Windows, tal como lo hace el programa "ExePropierties" o "MediaTab", pero nunca antes he programado para escritorio de Windows ni mucho menos una integración a la interfaz de Windows.

Quisiera que me indicaran que es lo que debería saber para hacerlo:

Que herramienta utilizar
Que SDK utilizar
Que lenguaje se usa

RayR

Eso se llama extensiones al shell. Es tema avanzado y necesitas conocer muy bien la API de Windows y, aunque sea a nivel introductorio/intermedio, la creación de servidores COM. Algunos links útiles:

http://winapi.conclase.net/
https://docs.microsoft.com/en-us/windows/win32/com/the-component-object-model

Luego de eso es buscar "Shell extensions".

Para eso usarías C++ y necesitas Visual C++. Otros compiladores como MinGW, que usan por defecto Dev-C++ y Code::Blocks, no sirven para esto.

@XSStringManolo

https://docs.microsoft.com/en-us/windows/win32/shell/shell-exts

Por mi poca experiencia con la Api de Windows no hay problemas utilizando codeblocks. Aunque visual studio te permite modificar y crear algunos archivos que codeblocks no contempla/facilita, no dejan de ser archivos de texto y hay guias para aprender a crearlos y utilizarlos a mano. Por ejemplo los archivos .rc para añadir iconos, imágenes y sonidos.

RayR

#3
Por supuesto que MinGW se puede usar para programación con la API de Windows, pero es limitado. Obviamente no me refiero a cosas simples como #defines o archivos sencillos de texto, que normalmente se pueden crear o modificar sin mayor problema. Pero Windows se compone de un montón de APIs y tecnologías y MinGW sólo es compatible con un subconjunto de ellas y muchas veces de forma incompleta, y eso no se arregla modificando archivos de texto. Sin ir muy lejos, hay dos formas estándar (una obsoleta y una moderna) en la API de Windows de mostrar un cuadro de diálogo para seleccionar exclusivamente directorios (no archivos), y ninguna de las dos se puede en MinGW. No queda más que programar una solución propia, o hacer modificaciones importantes y muy tediosas a lo que ya se incluye. MinGW-w64 sí que soporta la forma obsoleta, pero la actual, introducida con Windows Vista, no hay manera.

En este caso, es aún peor, ya que las extensiones al shell se deben implementar dentro de lo que se conoce como servidores COM dentro de proceso (in-process). COM es una especificación en la que normalmente se usan tecnologías propias de Microsoft. Por ejemplo, un lenguaje de Microsoft, que no es C++, junto con un un compilador propietario de Microsoft (que se incluye con Visual Studio), el cual genera unos archivos binarios en un formato específico. Aclarar que, para facilitar nuestro trabajo, nosotros como programadores podemos crear simplemente nuestros componentes, en C++, y las herramientas de Visual Studio se encargan del resto, como invocar al compilador antes mencionado. Por supuesto, MinGW no proporciona ni admite nada de esto. Aclaro también que en internet se puede encontrar información sobre crear objetos COM con C puro (lo que implicaría que se puede con MinGW), pero no son componentes COM totalmente "reales", no cumplen al 100% con la especificación. Los podríamos usar con nuestros programas, pero no de forma universal, que es el objetivo de COM. Aunque estrictamente hablando, para el caso concreto de extensiones al shell, no se necesita implementar todo lo de un servidor COM general, hay que usar las herramientas de Microsoft para evitar problemas.

Editado un par de typos y, aprovechando, unas puntualizaciones.

GaudyG

#4
Cita de: RayR en 29 Septiembre 2019, 20:46 PM
Eso se llama extensiones al shell. Es tema avanzado y necesitas conocer muy bien la API de Windows y, aunque sea a nivel introductorio/intermedio, la creación de servidores COM. Algunos links útiles:

http://winapi.conclase.net/
https://docs.microsoft.com/en-us/windows/win32/com/the-component-object-model

Luego de eso es buscar "Shell extensions".

Para eso usarías C++ y necesitas Visual C++. Otros compiladores como MinGW, que usan por defecto Dev-C++ y Code::Blocks, no sirven para esto.
Muchas gracias, desconozco que tanto es necesario conocer de la API de Windows, pero lo que necesito de la librería sería crear la pestaña solo para una extensión en específico, la información a imprimir en dicha ventana lo puedo conseguir todo extrayendo de la cabecera de los archivos. Espero introducirme al tema (y a aprender a programar C++) este fin de semana.

Esta bien si llegase a tener dudas lo consulte en este tema?

Por cierto, a que te refieres con Servidores COM o que relación tiene con los Shell Extension?

Muchas gracias

EdePC

Saludos,

- Me parece que se refiere a los Objetos COM, estas son bibliotecas o librerías (.DLL) que se cargan cuando sucede un evento en Windows, por ejemplo, para windows muestre las miniaturas de los íconos del escritorio, tiene que ejecutarse una dll que identifique los tipos de archivos y cargue las miniaturas correspondientes.

- Lo mismo sucede con el evento que se lanza al mostrar las Propiedades de Archivos o carpetas, por ejemplo el software HashTab que agrega una pestaña más a las propiedades de los archivos para calcular los Hash, se integra en la siguiente clave del Registro de Windows:

HKEY_LOCAL_MACHINE\SOFTWARE\Classes\*\shellex\PropertySheetHandlers\HashTab

-- Ahí hay un puntero CLSID: {8A56567E-A333-4843-B6E1-C3A262E41D8C} que a su vez apunta a "C:\Program Files\HashTab Shell Extension\HashTab64-6.0.0.34.dll" que justamente es el Objeto COM o ejecutable encargado de rellenar esa nueva pestaña apartada en el Registro de Windows.

- Tengo entendido de que Visual Studio IDE permite crear proyectos en Visual Basic o C# para crear Objetos COM. De todo esto me enteré viendo una conferencia que tiene más que ver Persistencia de Malware, quizá le interese a alguno:

Sheila Ayelen Berta - The Art of Persistence: "Mr. Windows... I don't wanna go :(" [RootedCON2019-ESPAÑOL]: https://youtu.be/xXzDPI7MCuY

RayR

De la API de Windows necesitas conocer muy bien cómo se crean y cómo funcionan las ventanas, eventos y mensajes, controles, y cómo crear dlls. Mucho de esto lo puedes encontrar en el primer link que puse. Básicamente, de ahí sáltate todo lo de GDI, que es para gráficos y no lo necesitas.

COM es una tecnología de Microsoft para crear componentes que en teoría se pueden usar desde programas hechos en cualquier lenguaje, independientemente del lenguaje en el que el componente haya sido creado. Los archivos que contienen estos componentes se llaman servidores COM, que pueden ser .exe (en cuyo caso se llaman servidores fuera de proceso) o .dll (servidores dentro de proceso) con ciertas características especiales. Las extensiones del Shell se deben crear como servidores COM; en concreto, el tipo de extensión que tú necesitas crear es un servidor dentro de proceso, es decir, una dll de COM. Para tu ejemplo, básicamente cuando haces clic derecho/propiedades sobre un archivo, el proceso explorer (el shell) busca en el registro de Windows a ver si hay algún componente COM registrado para ese tipo de archivo y, en su caso, carga la dll que lo contiene (el servidor COM que creamos) y llama a una función dentro de ella y ésta se encarga de crear la pestaña extra y agregarla al cuadro de diálogo. Así es como funciona el mecanismo de las extensiones y por eso hay que saber COM.

Técnicamente se puede programar COM en otros lenguajes, como VB6 o Delphi, pero uno está obsoleto y el otro ya no se usa mucho. Y aunque C# y VB.Net también sirven para COM en general, no se deben usar para este tipo de extensiones al shell, lo que deja a C++ básicamente como la única opción. Y deberías usar Visual Studio porque en caso contrario, y por varias cuestiones que serían largas de explicar, casi tendrás garantizados muchos problemas y quebraderos de cabeza.

Y sí, podrías poner aquí o abrir tema nuevo si tienes otras dudas.