txt por manejo linea libreria lenguaje leer lectura guardar fputs escritura ejercicios datos binarios archivos archivo c++ registry file-extension

por - Crear entrada de registro para asociar la extensión de archivo con la aplicación en C++



libreria fstream c++ (3)

Este es un proceso de dos pasos:

1. Define a program that would take care of extension: (unless you want to use existing one) 1.1 create a key in "HKCU//Software//Classes//" for example "Software//Classes//YourProgramName.file.ext" 1.2 create subkey "Software//Classes//YourProgramName.file.ext//DefaultIcon" 1.2.1 set default value ("") to your application full path to get icon from resources 1.3 create a subkey "Software//Classes//YourProgramName.file.ext//Shell//OperationName//Command" OperationName = for example Open, Print or Other 1.3.1 set default value ("") to your application full path +optional runtime params (filename) 2.Associate file extension with program. 2.1 create a key HKCU//Software//Classes//.ext - here goes your extension 2.2 set default value to the program definition key ("YourProgramName.file.ext")

A continuación, se incluye una parte del programa escrito en c #, que asocia la extensión del archivo. No es c ++, pero creo que es lo suficientemente simple como para explicarse y AFAIK es muy similar o idéntico al código en c ++

1.

RegistryKey keyPFCTExt0 = Registry.CurrentUser.OpenSubKey("Software//Classes//PFCT.file.enc", true); if (keyPFCTExt0 == null) { keyPFCTExt0 = Registry.CurrentUser.CreateSubKey("Software//Classes//PFCT.file.enc"); keyPFCTExt0.CreateSubKey("DefaultIcon"); RegistryKey keyPFCTExt0ext = Registry.CurrentUser.OpenSubKey("Software//Classes//PFCT.file.enc//DefaultIcon", true); keyPFCTExt0ext.SetValue("", Application.ExecutablePath +",0"); keyPFCTExt0ext.Close(); keyPFCTExt0.CreateSubKey("Shell//PFCT_Decrypt//Command"); } keyPFCTExt0.SetValue("", "PFCT.file.enc"); keyPFCTExt0.Close();

2.

RegistryKey keyPFCTExt1 = Registry.CurrentUser.OpenSubKey("Software//Classes//PFCT.file.enc//Shell//PFCT_Decrypt//Command", true); if (keyPFCTExt1 == null) keyPFCTExt1 = Registry.CurrentUser.CreateSubKey("Software//Classes//PFCT.file.enc//Shell//PFCT_Decrypt//Command"); keyPFCTExt1.SetValue("", Application.ExecutablePath + " !d %1"); //!d %1 are optional params, here !d string and full file path keyPFCTExt1.Close();

Me gustaría conocer la forma más limpia de registrar una extensión de archivo con mi aplicación C ++ para que cuando se haga doble clic en un archivo de datos asociado a mi programa, se abra la aplicación y se pase el nombre de archivo como parámetro a la aplicación.

Actualmente, hago esto a través de mi instalador de wix, pero hay algunos casos en que la aplicación no se instalará en la computadora de ese usuario, por lo que también necesito la opción de crear la clave de registro a través de la aplicación.

Además, ¿esto también significa que si se elimina la aplicación, las entradas no utilizadas en el registro se quedarán por ahí?


No sé por qué la gente sigue diciendo que el valor predeterminado de HKEY_CURRENT_USER/Software/Classes/<.ext> (que te redirigirá a otra clase (creada por software).

Funciona, pero será anulado por

HKEY_CURRENT_USER/Software/Microsoft/Windows/CurrentVersion/Explorer/FileExts/<.ext>/UserChoice

Y creo que Microsoft recomienda la segunda práctica, porque es lo que está haciendo el "abrir con" integrado. El valor de la clave Progid "es igual al valor predeterminado de HKEY_CURRENT_USER/Software/Classes/<.ext> en este caso.


Su descripción básica del proceso se encuentra en este artículo de MSDN . Las partes clave se encuentran en la parte inferior de la lista:

  • Registre el ProgID

Un ProgID (esencialmente, la clave de registro del tipo de archivo) es lo que contiene sus propiedades importantes del tipo de archivo, como el icono, la descripción y los elementos del menú contextual, incluida la aplicación utilizada cuando se hace doble clic en el archivo. Muchas extensiones pueden tener el mismo tipo de archivo. Ese mapeo se hace en el siguiente paso:

  • Registre la extensión del nombre de archivo para el tipo de archivo

Aquí, establece un valor de registro para su extensión, configurando el tipo de archivo de esa extensión al ProgID que creó en el paso anterior.

La cantidad mínima de trabajo requerida para abrir un archivo con su aplicación es establecer / crear dos claves de registro. En este ejemplo de archivo .reg , creo un tipo de archivo ( blergcorp.blergapp.v1 ) y asocio una extensión de archivo ( .blerg ) con él.

Windows Registry Editor Version 5.00 [HKEY_CURRENT_USER/Software/Classes/blergcorp.blergapp.v1/shell/open/command] @="c:/path/to/app.exe /"%1/"" [HKEY_CURRENT_USER/Software/Classes/.blerg] @="blergcorp.blergapp.v1"

Ahora, probablemente quieras lograr esto programáticamente. Para ser absolutamente kosher, podría verificar la existencia de estas claves y cambiar el comportamiento de su programa en consecuencia, especialmente si está asumiendo el control de alguna extensión de archivo común. Sin embargo, el objetivo se puede lograr estableciendo esas dos teclas usando la función SetValue.

No estoy seguro de la sintaxis exacta de C ++, pero en C # la sintaxis se ve así:

Registry.SetValue(@"HKEY_CURRENT_USER/Software/Classes/blergcorp.blergapp.v1/shell/open/command", null, @"c:/path/to/app.exe /"%1/""); Registry.SetValue(@"HKEY_CURRENT_USER/Software/Classes/.blerg", null, "blergcorp.blergapp.v1");

Por supuesto, puede abrir manualmente cada subclave, crear manualmente el ProgID y la subclave de extensión, y luego establecer el valor de la clave, pero algo bueno acerca de la función SetValue es que si las claves o valores no existen, se crearán automáticamente. . Muy útil.

Ahora, una palabra rápida sobre qué colmena usar. Muchos ejemplos de asociación de archivos en línea, incluidos los de MSDN, muestran que estas claves se configuran en HKEY_CLASSES_ROOT . No recomiendo hacer esto Esa colmena es una vista virtual combinada de HKEY_LOCAL_MACHINE/Software/Classes (los valores predeterminados del sistema) y HKEY_CURRENT_USER/Software/Classes (la configuración por usuario) y escribe en cualquier subclave de la colmena se redirigen a la misma clave en HKEY_LOCAL_MACHINE/Software/Classes . Ahora, no hay un problema directo al hacerlo, pero puede encontrarse con este problema: si escribe en HKCR (redirigido a HKLM) y el usuario ha especificado las mismas claves con diferentes valores en HKCU, prevalecerán los valores de HKCU. Por lo tanto, sus escrituras tendrán éxito pero no verá ningún cambio, porque la configuración de HKEY_CURRENT_USER tiene prioridad sobre la configuración de HKEY_LOCAL_MACHINE .

Por lo tanto, debe tener esto en cuenta al diseñar su aplicación. Ahora, por el otro lado, puede escribir solo HKEY_CURRENT_USER , como muestran mis ejemplos aquí. Sin embargo, esa configuración de asociación de archivos solo se cargará para el usuario actual, y si su aplicación se ha instalado para todos los usuarios, su aplicación no se iniciará cuando ese otro usuario abra el archivo en Windows.

Eso debería ser una cartilla decente para lo que quieres hacer. Para leer más, sugiero

Y vea también mi respuesta similar a una pregunta similar: