Ir al contenido


Foto

Como deshacer la asociación de una extensión con un ejecutable


  • Por favor identifícate para responder
4 respuestas en este tema

#1 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4.107 mensajes
  • LocationMadrid - España

Escrito 24 septiembre 2009 - 05:02

Como complemento a la función RegisterFileType, os dejo este otro truco, esta vez para eliminar la asociación entre un tipo de archivo con un ejecutable.



cpp
  1. #define ShlObjHPP
  2. #include <vcl.h>
  3. #pragma hdrstop
  4.  
  5. #include <shlobj.h>
  6. #include <Registry.hpp>
  7.  
  8. void UnRegisterFileType(AnsiString Ext, AnsiString PathExec, BOOL Full)
  9. {
  10.   // Ext tipo de archivo : EXTENSION
  11.   // PathExec: RUTA COMPLETA del ejecutable que queremos asociar
  12.  
  13.   TRegistry *Registry = new TRegistry;
  14.   try{
  15.     Registry->RootKey = HKEY_CLASSES_ROOT;
  16.  
  17.     // Borrar la clave .Ext
  18.     if(Full)
  19.       Registry->DeleteKey("." + Ext);
  20.     else if(Registry->OpenKey("." + Ext, false)){
  21.       // Valor con el nombre del tipo de archivo para esta clave (extfile)
  22.       Registry->DeleteValue("");
  23.       Registry->CloseKey();
  24.     }
  25.  
  26.     // Borrar la clave del nombre del tipo de archivo dado antes (extfile)
  27.     if(Registry->KeyExists(Ext + "file")){
  28.       if(Full)
  29.         Registry->DeleteKey(Ext + "file");
  30.       else{
  31.         // Crear una nueva clave para el icono por defecto
  32.         if(Registry->OpenKey(Ext + "file\\DefaultIcon", true)){
  33.           // Crear un valor con el icono (PathExec.exe,0)
  34.           if(Registry->ReadString("").Pos(PathExec))
  35.             Registry->DeleteValue("");
  36.           Registry->CloseKey();
  37.         }
  38.         if(Registry->OpenKey(Ext + "file\\shell\\open\\command", true)){
  39.           //Crear el valor para el ejecutable que abre el tipo de archivo (PathExec.exe "%1")
  40.           if(Registry->ReadString("").Pos(PathExec))
  41.             Registry->DeleteValue("");
  42.           Registry->CloseKey();
  43.         }
  44.       }
  45.     } 
  46.   }
  47.   __finally{
  48.     delete Registry;
  49.   }
  50.   // Notificar al sistema el cambio efectuado
  51.   SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_IDLIST, 0, 0);
  52. }



El parámetro bool Full sirve para eliminar por completo las claves creadas para el tipo de archivo con la función RegisterFileType. Si se le da el valor true lo hará, si es false, sólo eliminará los valores referentes a la aplicación que lo abre y de su icono.

Que le saquéis partido

Saludos.
  • 0

#2 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.446 mensajes
  • LocationMéxico

Escrito 24 septiembre 2009 - 05:25

Muy bueno amigo escafandra, por supuesto que se le puede sacar partido a tu código, es frecuente que requieras de cambiar la asociación de archivos :)

Salud OS
  • 0

#3 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 20 enero 2010 - 05:27

Amigo escafandra, tendrás la traducción de ese code en Delphi?, porque al tratar de traducirlo me da problemas en una linea, que es:



cpp
  1. if (Registry->ReadString('').Pos(PathExec))



No sé el motivo del punto y luego la función Pos :(.

Saludos.
  • 0

#4 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4.107 mensajes
  • LocationMadrid - España

Escrito 21 enero 2010 - 03:38

Amigo escafandra, tendrás la traducción de ese code en Delphi?, porque al tratar de traducirlo me da problemas en una linea, que es:



cpp
  1. if (Registry->ReadString('').Pos(PathExec))



No sé el motivo del punto y luego la función Pos :(.

Saludos.


En Builder C++ tanto String como AnsiString son una clase. Las funciones de cadena, y entre ellas Pos, son tratadas como miembros de la clase, de aquí la sintaxis con el "punto". La traducción correcta sería:



delphi
  1. if Pos(Registry.ReadString(''), PathExec) <> 0 then



Traduzco todo el código:



delphi
  1. uses
  2.   ShlObj, Registry;
  3.  
  4. //.................................
  5.  
  6.  
  7. procedure UnRegisterFileType(Ext, PathExec: String; Full: boolean);
  8. var
  9. Registry: TRegistry ;
  10. begin
  11.   // Ext tipo de archivo : EXTENSION
  12.   // PathExec: RUTA COMPLETA del ejecutable que queremos asociar
  13.  
  14.   Registry:= TRegistry.Create;
  15.   try
  16.     Registry.RootKey:= HKEY_CLASSES_ROOT;
  17.  
  18.     // Borrar la clave .Ext
  19.     if Full = TRUE then
  20.       Registry.DeleteKey('.' + Ext)
  21.     else if Registry.OpenKey('.' + Ext, false) = TRUE then
  22.     begin
  23.       // Valor con el nombre del tipo de archivo para esta clave (extfile)
  24.       Registry.DeleteValue('');
  25.       Registry.CloseKey();
  26.     end;
  27.  
  28.     // Borrar la clave del nombre del tipo de archivo dado antes (extfile)
  29.     if Registry.KeyExists(Ext + 'file') = TRUE then
  30.     begin
  31.       if Full = TRUE then
  32.         Registry.DeleteKey(Ext + 'file')
  33.       else
  34.       begin
  35.         // Crear una nueva clave para el icono por defecto
  36.         if Registry.OpenKey(Ext + 'file\DefaultIcon', true) = TRUE then
  37.         begin
  38.           // Crear un valor con el icono (PathExec.exe,0)
  39.           if Pos(Registry.ReadString(''), PathExec) <> 0 then
  40.             Registry.DeleteValue('');
  41.           Registry.CloseKey();
  42.         end;
  43.         if Registry.OpenKey(Ext + 'file\shell\open\command', true) = TRUE then
  44.         begin
  45.           //Crear el valor para el ejecutable que abre el tipo de archivo (PathExec.exe "%1")
  46.           if Pos(Registry.ReadString(''), PathExec) <> 0 then
  47.             Registry.DeleteValue('');
  48.           Registry.CloseKey();
  49.         end;
  50.       end;
  51.     end;
  52.   finally
  53.     Registry.Free;
  54.   end;
  55.   // Notificar al sistema el cambio efectuado
  56.   SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_IDLIST, nil, nil);
  57. end;



Saludos.
  • 0

#5 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 21 enero 2010 - 08:50

Ah caray, nunca me iba a imaginar eso, la traducción que tengo es igual al que pones a excepción de esas líneas :p, para las próxima tomo nota :D, gracias amigo.

Saludos.
  • 0




IP.Board spam blocked by CleanTalk.