Su descripción básica del proceso se encuentra en this MSDN article. Las partes claves están en la parte inferior de la lista:
- Registrar el identificador de programa
Un identificador de programa (en esencia, la clave de registro tipo de archivo) es lo que contiene sus importantes propiedades de tipo de archivo, como icono, descripción y 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. Esa transformación se realiza en el siguiente paso:
- registrar la extensión del nombre de archivo para el tipo de archivo
Aquí, se establece un valor de registro para su extensión, establecer el tipo de archivo que la extensión a la ProgID se creado 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 desee 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 positivo de la sintaxis exacta de C++, pero en C# la sintaxis se ve algo como esto:
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 podría abrir manualmente cada sub clave, crear manualmente el identificador de programa y extensión subclave, y luego establece el valor de la clave, pero algo bueno sobre 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 en 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 HKEY_CURRENT_USER
tiene prioridad sobre las configuraciones HKEY_LOCAL_MACHINE
.
Por lo tanto, debe tener esto en cuenta al diseñar su aplicación. Ahora, en la otra cara puede escribir solo a 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.
Debe ser una cartilla decente para lo que quiere hacer. Para la lectura adicional Sugiero
Y veo también mi respuesta similar a una pregunta similar:
Para editar la clave (predeterminada), debe usar: @ =" c: \\ ruta \\ a \\ app.exe \ "% 1 \" " Nota: la doble" \\ " – Fraga
Me parece que agregar estos elementos de registro en el código sobrescribe los existentes de otras aplicaciones. Me gusta _add_ mine sin reemplazar los existentes. Regedit me muestra que esos multi -las entradas de elección utilizan claves adicionales como "OpenWithList". ¿Tengo que crearlas manualmente si hay una clave existente, o hay un método más simple? ¿O será mejor que pregunte esto en mi propia pregunta de SO? –
Respondiendo a mi propia pregunta: lo he descubierto. Si necesita la respuesta, señale una pregunta de SO adecuada y la completaré. –