Ir al contenido


Foto

Como asociar un tipo de archivo con el ejecutable que lo abre


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

#1 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4.111 mensajes
  • LocationMadrid - España

Escrito 24 septiembre 2009 - 04:28

Para asociar un tipo de extensión con un ejecutable utilizaremos el registro de la siguiente manera:



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


Si queremos asociar la extensión "txt", por ejemplo, con nuestro programa:


cpp
  1. 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.
  • 0

#2 razadi

razadi

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 681 mensajes
  • LocationMéxico D.F.

Escrito 24 septiembre 2009 - 07:48

Excelente aporte escafranda, gracias y saludos
  • 0

#3 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 24 septiembre 2009 - 07:59

Excelente aportación :D, me hice el valiente en este caso e hice una versión en Delphi :$, estoy que necesita alguna mejoras, espero no te molestes amigo:



delphi
  1. procedure AsociarExt(Ext, AppPath: String);
  2. var
  3.   Registry: TRegistry;
  4. begin
  5.   Registry := TRegistry.Create;
  6.   try
  7.     Registry.RootKey := HKEY_CLASSES_ROOT;
  8.  
  9.     Registry.OpenKey(Ext, true);
  10.     Registry.WriteString('', Ext);
  11.     Registry.CloseKey;
  12.  
  13.     Registry.OpenKey('shell\open\command', true);
  14.     Registry.WriteString('', AppPath + ' "%1"');
  15.   finally
  16.     Registry.Free;
  17.   end;
  18. end;



Saludos.
  • 0

#4 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4.111 mensajes
  • LocationMadrid - España

Escrito 24 septiembre 2009 - 12:35

Excelente aportación :D, me hice el valiente en este caso e hice una versión en Delphi :$, estoy que necesita alguna mejoras, espero no te molestes amigo...


No me molesta, además muchos delphiparlantes lo preferirán así. Sólo un detalle, olvidaste asociar el icono de la aplicación.  :p

De todas formas cuando un tipo de archivo es totalmente nuevo se debe añadir una clave de nombre punto+EXT (para axchivos txt, por ejemplo: .txt) y escribir en ella el valor del nombre del tipo de archivo, o al menos eso tenía entendido  :^)

Saludos.
  • 0

#5 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 19 enero 2010 - 06:13

Bueno, en un momento de aburrimiento volví y me hice el guapo, hice la versión para delphi que es prácticamente igual al que tienes :p, Aquí lo dejo:



delphi
  1. procedure RegisterFileType(Ext,PathExec: string);
  2. var Registry: TRegistry;
  3. begin
  4.   Registry := TRegistry.Create;
  5.     try
  6.       Registry.RootKey := HKEY_CLASSES_ROOT;
  7.       //Crear la Clave .Ext
  8.       if (Registry.OpenKey('.'+Ext, True)) then
  9.       begin
  10.         // Valor con el nombre del tipo de archivo para esta clave (extfile)
  11.         Registry.WriteString('', Ext + 'file');
  12.         Registry.CloseKey;
  13.       end;
  14.       // Crear una clave nueva para el nombre del tipo de archivo dado antes (extfile)
  15.       if (Registry.CreateKey(Ext + 'file')) then
  16.         begin
  17.           // Crear una nueva clave para el icono por defecto
  18.           if (Registry.OpenKey(Ext + 'file\\DefaultIcon', true)) then
  19.           begin
  20.             // Crear un valor con el icono (PathExec.exe,0)
  21.             Registry.WriteString('', PathExec + ',0');
  22.             Registry.CloseKey;
  23.           end;
  24.           if (Registry.OpenKey(Ext + 'file\\shell\\open\\command', true)) then
  25.           begin
  26.             //Crear el valor para el ejecutable que abre el tipo de archivo (PathExec.exe "%1")
  27.             Registry.WriteString('', PathExec + '"%1"');
  28.             Registry.CloseKey;
  29.           end;
  30.         end;
  31.     finally
  32.       Registry.Free;
  33.     end;
  34. SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_IDLIST, 0, 0);
  35. end;



A ver si ahora quedó mejor :D

Saludos.
  • 0

#6 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4.111 mensajes
  • LocationMadrid - España

Escrito 19 enero 2010 - 06:31

(y) Cuando tenga necesidad bajo delphi ya lo tengo traducido  :p  :D

Saludos.
  • 0

#7 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 19 enero 2010 - 06:36

(y) Cuando tenga necesidad bajo delphi ya lo tengo traducido  :p  :D

Saludos.


Ah vaya :D
  • 0

#8 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4.111 mensajes
  • LocationMadrid - España

Escrito 21 enero 2010 - 03:30

Retoco la traducción que hizo enecumene:

Básicamente se trata de arreglar las cadenas, en C para escribir un carácter '\' se escribe '\\', pues ese carácter tiene un significado especial como código de control. De esta forma, al traducir a delphi debemos quitar uno de los caracteres. Cuando en C queremos colocar comillas dentro de una cadena, el compilador precisa que se coloquen así \", puesto que el carácter " se dedica a decirle al compilador que lo que sigue es una cadena de texto literal. De esta forma al traducir a delphi, debemos quitar el carácter '\'

También falta un espacio en '"%1"' debe ser ' "%1"'



delphi
  1. uses
  2.   ShlObj, Registry;
  3.  
  4.  
  5. procedure RegisterFileType(Ext,PathExec: string);
  6. var Registry: TRegistry;
  7. begin
  8.   Registry := TRegistry.Create;
  9.     try
  10.       Registry.RootKey := HKEY_CLASSES_ROOT;
  11.       //Crear la Clave .Ext
  12.       if (Registry.OpenKey(&#39;.&#39;+Ext, True)) then
  13.       begin
  14.         // Valor con el nombre del tipo de archivo para esta clave (extfile)
  15.         Registry.WriteString(&#39;&#39;, Ext + &#39;file&#39;);
  16.         Registry.CloseKey;
  17.       end;
  18.       // Crear una clave nueva para el nombre del tipo de archivo dado antes (extfile)
  19.       if (Registry.CreateKey(Ext + &#39;file&#39;)) then
  20.         begin
  21.           // Crear una nueva clave para el icono por defecto
  22.           if (Registry.OpenKey(Ext + &#39;file\DefaultIcon&#39;, true)) then
  23.           begin
  24.             // Crear un valor con el icono (PathExec.exe,0)
  25.             Registry.WriteString(&#39;&#39;, PathExec + &#39;,0&#39;);
  26.             Registry.CloseKey;
  27.           end;
  28.           if (Registry.OpenKey(Ext + &#39;file\shell\open\command&#39;, true)) then
  29.           begin
  30.             //Crear el valor para el ejecutable que abre el tipo de archivo (PathExec.exe "%1")
  31.             Registry.WriteString(&#39;&#39;, PathExec + &#39; "%1"&#39;);
  32.             Registry.CloseKey;
  33.           end;
  34.         end;
  35.     finally
  36.       Registry.Free;
  37.     end;
  38. SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_IDLIST, nil, nil);
  39. end;



Saludos.
  • 0

#9 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 21 enero 2010 - 08:42

Gracias escafandra tomo nota :D (y).
  • 0




IP.Board spam blocked by CleanTalk.