Autor Tema: Registro de windows en C  (Leído 9333 veces)

Desconectado intropedro

  • Junior Member
  • **
  • Mensajes: 17
Registro de windows en C
« en: 02 de Septiembre de 2004, 05:01:11 pm »
Hola, quiero hacer un programa en C para que me asocie una extension que le indique para que la abra con el programa que le diga, para ello me an dicho que tengo que utilizar el registro de windows.

¿Alguien es este foro sabe programar con el registro de windows?

Saludos

Desconectado ALP

  • Member
  • ***
  • Mensajes: 234
Registro de windows en C
« Respuesta #1 en: 02 de Septiembre de 2004, 09:44:41 pm »
Hola.

Para trastear el registro del sistema dispones de múltiples funciones. Las puedes encontrar aquí:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/sysinfo/base/registry_functions.asp

Es fácil utilizarlas. Lo fundamental es que llames a RegOpenKeyEx() para abrir una clave existente, o RegCreateKeyEx() para crearla, y al finalizar, debes llamar a RegCloseKey().

Verás que también  hay funciones de la shell, como AssocCreate, si entras en este enlace, y te vas a la definición del interfaz IQueryAssociations, encontrarás un enlace en el que te explica cómo crear una asociación de un tipo de fichero. Lo tienes aquí:
http://msdn.microsoft.com/library/en-us/shellcc/platform/shell/programmersguide/shell_basics/shell_basics_extending/fileassociations/fileassoc.asp


Un saludo.
Si no puedes deslumbrar con tu sabiduría, desconcierta con tus gilipolleces.

Desconectado intropedro

  • Junior Member
  • **
  • Mensajes: 17
Registro de windows en C
« Respuesta #2 en: 03 de Septiembre de 2004, 11:08:02 am »
Ok, muchas gracias por los links, mi ingles es un poco malo pero voy a ver si voy entendiendo las cosas. He estedo leyendo la parte de asocias a la extension el programa y  he visto que tengo que añadir una entrada en HKEY_CLASSES_ROOT para la extension y otra para el programa (ya que los programas no los tendre instalados) pero querria saber donde estan los registros de las extensiones, solo tengo que poner HKEY_CLASSES_ROOT o hay que poner algo mas?

Saludos

Desconectado ALP

  • Member
  • ***
  • Mensajes: 234
Registro de windows en C
« Respuesta #3 en: 03 de Septiembre de 2004, 09:51:37 pm »
Bueno, veamos....
Creo que no tienes claro cómo funciona el registro en este tema. Yo tampoco lo conozco a fondo, por lo que no tomes como definitivo lo que sigue.

Vamos a investigar un poco el registro sel sistema.

Con el regedit.exe, abro HKEY_CLASES_ROOT.
Me voy a la extensión [].cpp[/i]. Encuentro que en el valor predeterminado tiene almacenada la cadena DevCpp.cpp.
Bien, sigo hacia abajo, paso las extensiones hasta que encuentro la cadena DevCpp.cpp.

Dentro tiene varias entradas, pero la que nos interesa está en shell -> open -> command, que contiene la cadena C:\Dev-Cpp\DevCpp.exe "%1"

Todo esto nos indica que los ficheros con la extensión cpp están "registrados" en la entrada DevCpp.cpp. En esta entrada, la clave indicada (command), nos indica que el sistema ejecutará la orden C:\Dev-Cpp\DevCpp.exe "%1", donde "%1" se refiere al primer parámetro (en este caso el nombre del fichero .cpp al que haces un doble click), y el que esté encerrado entre comillas es para que permita nombres largos con espacios.

Hasta aquí, lo que podemos apreciar a simple vista. Yo, lo que haría es:
1.- Aprender el funcionamiento correcto de la asignación de extensiones, sin entrar en programación, aunque lo más probable es que estas cosas las encuentres en el MSDN.
2.- Hacer pruebas "a mano"
3.- Una vez que lo tienes claro, haces el programa.

Un saludo.
Si no puedes deslumbrar con tu sabiduría, desconcierta con tus gilipolleces.

Desconectado intropedro

  • Junior Member
  • **
  • Mensajes: 17
Registro de windows en C
« Respuesta #4 en: 03 de Septiembre de 2004, 10:34:23 pm »
OK, Pos voy a ver si lo ago a mano una asignacion de extensiones (no creo que tenga problemas a mano) y luego me pongo a programar.

Muchas gracias por tu ayuda, me cuesta empezar con esto y como casi todo que encuentro esta en ingles y mi ingles es muy malo me cuesta demasiado y como hay muy poca gente que sabe de esto..

Saludos

Desconectado intropedro

  • Junior Member
  • **
  • Mensajes: 17
Registro de windows en C
« Respuesta #5 en: 03 de Septiembre de 2004, 11:15:24 pm »
Hola, ya e asociado una extension que e creado .hola a un programa que tenia por ahi, el programa se a abierto al dar doble clic al archivo tralari.hola asi que creo que lo e echo bien. ahora voy a ver si creo un programa que haga lo que e echo a mano con otra extension y cuando me funcione ya le ire metiendo mas. Ya pondre mis resultados.

SAludos

Desconectado intropedro

  • Junior Member
  • **
  • Mensajes: 17
Registro de windows en C
« Respuesta #6 en: 03 de Septiembre de 2004, 11:57:05 pm »
Hola, pues a ver ya e echo la primera version ( jeje ), pero no se que librerias necesito para usar las funciones del registro, a ver si alguien me puede ayudar. Aqui os dejo lo que llevo echo.


#include <stdio.h>

main(){

char *lRet;
long key;

lRet = RegCreateKey(HKEY_CLASSES_ROOT, ".adios", key);
if(lRet != ERROR_SUCCESS){
  RegSetValue(key, "", REG_SZ, "Programa_adios", sizeof("Programa_adios"));
  RegCloseKey(key);
}

lRet = RegCreateKey(HKEY_CLASSES_ROOT, "Programa_adios\shell\open\command", key);
if(lRet != ERROR_SUCCESS){
  RegSetValue(key, "", REG_SZ, "D:\0 PROGRAMAS\vlc-0.7.2\vlc.exe "%1"", sizeof("D:\0 PROGRAMAS\vlc-0.7.2\vlc.exe "%1""));
  RegCloseKey(key);
}


}

Saludos

Desconectado ALP

  • Member
  • ***
  • Mensajes: 234
Registro de windows en C
« Respuesta #7 en: 04 de Septiembre de 2004, 12:23:50 am »
Bien, es un buen comienzo.
Te pongo algunos apuntes:

En primer lugar, no utilices RegCreateKey() puesto que es una función obsoleta; en su lugar utiliza RegCreateKeyEx(). Debes leer atentamente la documentación, ya que no se garantiza que las funciones "obsoletas" funcionen en los nuevos sistemas.

No utilices cadenas constantes. Las variables te permiten una mejor legibilidad del código, además de permitir una modificación más rápida.


La condición de error está mal, si todo va bien el valor que devuelve es ERROR_SUCCESS (que la constante contenga la palabra "error", no significa que haya un error)

Te pongo tu código, adaptado:
Citar
lRet = RegCreateKey(HKEY_CLASSES_ROOT, ".adios", key);
if(lRet != ERROR_SUCCESS){
RegSetValue(key, "", REG_SZ, "Programa_adios", sizeof("Programa_adios"));
RegCloseKey(key);



Código: [Seleccionar]
HKEY key;
LONG ret_key;
DWORD tam, Disposition;
char *ext  = ".adios";
char *prog = "Programa_adios";

tam = lstrlen(prog);
ret_key = RegCreateKeyEx(HKEY_CLASSES_ROOT, ext, 0, "",
                         REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS,
                         NULL, &key, &Disposition);
if (ret_key == ERROR_SUCCESS) {
   ret_key = RegSetValueEx(key, "", 0, REG_SZ, (LPBYTE)prog, tam);
   if (ret_key != ERROR_SUCCESS) {
/* error !!! no se ha podido asignar el valor */
   }
   RegCloseKey(key);
} else {
   /* error !!! no se ha podido crear la entrada en el registro */
}


Para poder utilizar estas funciones, debes disponer de un compilador para windows (aunque el programa no tenga ventanas). Debes incluir el fichero "<windows.h>", y si el compilador no te la incluye directamente, la librería es Advapi32.lib. Toda esta información la tienes en la documentación.

Un saludo.
Si no puedes deslumbrar con tu sabiduría, desconcierta con tus gilipolleces.

Desconectado intropedro

  • Junior Member
  • **
  • Mensajes: 17
Registro de windows en C
« Respuesta #8 en: 04 de Septiembre de 2004, 04:34:06 pm »
Hola, ya lo e compilao y me funciona, para lo del programa e echo esto modificando el codigo que me diste para lo de la extension:

Código: [Seleccionar]
char *direccion = "D:\\0 PROGRAMAS\\vlc-0.7.2\\vlc.exe";
char *abrir = "Programa_adios\\shell\\open\\command";

tam = lstrlen(direccion);
ret_key = RegCreateKeyEx(HKEY_CLASSES_ROOT, abrir, 0, "",
                         REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS,
                         NULL, &key, &Disposition);
if (ret_key == ERROR_SUCCESS) {
   ret_key = RegSetValueEx(key, "", 0, REG_SZ, (LPBYTE)direccion, tam);
   if (ret_key != ERROR_SUCCESS) {
   /* error !!! no se ha podido asignar el valor PROGRAMA*/
   }
   RegCloseKey(key);
} else {
   /* error !!! no se ha podido crear la entrada en el registro PROGRAMA*/
}


Tube algun problema con las direcciones con \  me daba unos warnings (supongo que porque pensba que lo que iba detras era un caracter especial (Ej: \n) y no lo encontraba), probe poniendo %5D el codigo ascii y tampoco me iba, al final mire un ejemplo de codigo en msdn y vi que los ponia dobles, la cosa es que funciona, no tengo claro el porque de esto pero va.


Ahora que ya tengo esto funcionando mi segundo paso e decidido que sea guardar lo habia antes de lo que pongo, no se si me explico, para asi despues poderlo dejar como estaba.

Mi idea es leer donde escribo antes de escribir y si no me da error la lectura (entonces sera que hay algo) guardarlo en un archivo de texto.

Es buena idea o me recomiendan algo diferente?

Saludos

Desconectado ALP

  • Member
  • ***
  • Mensajes: 234
Registro de windows en C
« Respuesta #9 en: 05 de Septiembre de 2004, 02:47:04 am »
El carácter \ en C es especial; se utiliza para introducir secuencias de escape en cadenas (como \n). Si quieres introducir este mismo carácter en una cadena, debes ponerlo doble, tal y como has visto en los ejemplos del msdn.

Respecto al tema de almacenar las cadenas existentes en un fichero, yo utilizaría el mismo registro, ya que estás con ello, y es más seguro que un fichero de texto (que cualquiera podría borrar). Almacénalo con un identificador que sepas que no existe, dentro de la misma clave en la que estás trabajando. Para restaurarlo, compruebas si existe dicho identificador, y si es así, sabes que lo has modificado. Tras restarurarlo, lo borras y dejas el registro como estaba.

Un saludo.
Si no puedes deslumbrar con tu sabiduría, desconcierta con tus gilipolleces.

 

Aviso Legal | Política de Privacidad | Política de Cookies

el contenido de la web se rige bajo licencia
Creative Commons License