#define ShlObjHPP #include <vcl.h> #pragma hdrstop #include <shlobj.h> #include <Registry.hpp> //--------------------------------------------------------------------------- void RegisterFileType(AnsiString Ext, AnsiString PathExec) { // Ext tipo de archivo : EXTENSION // PathExec: RUTA COMPLETA del ejecutable que queremos asociar TRegistry *Registry = new TRegistry; try{ Registry->RootKey = HKEY_CLASSES_ROOT; // Crear la clave .Ext if(Registry->OpenKey("." + Ext, true)){ // Valor con el nombre del tipo de archivo para esta clave (extfile) Registry->WriteString("", Ext + "file"); Registry->CloseKey(); } // Crear una clave nueva para el nombre del tipo de archivo dado antes (extfile) if(Registry->CreateKey(Ext + "file")){ // Crear una nueva clave para el icono por defecto if(Registry->OpenKey(Ext + "file\\DefaultIcon", true)){ // Crear un valor con el icono (PathExec.exe,0) Registry->WriteString("", PathExec + ",0"); Registry->CloseKey(); } if(Registry->OpenKey(Ext + "file\\shell\\open\\command", true)){ //Crear el valor para el ejecutable que abre el tipo de archivo (PathExec.exe "%1") Registry->WriteString("", PathExec + " \"%1\""); Registry->CloseKey(); } } } __finally{ delete Registry; } // Notificar al sistema el cambio efectuado SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_IDLIST, 0, 0); }
Si queremos asociar la extensión "txt", por ejemplo, con nuestro programa:
RegisterFileType("txt", Application->ExeName);
Para reasignar la extensión a otro ejecutable, basta con volver a llamar a la función.
Que le saquéis partido.
Saludos.