Foros de daboweb

MULTIMEDIA, Video digital, Grabación, Diseño gráfico, Diseño web, Programación => Webmasters - Diseño Web - Programación - Diseño gráfico => Mensaje iniciado por: intropedro en 02 de Septiembre de 2004, 05:01:11 pm

Título: Registro de windows en C
Publicado por: intropedro 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
Título: Registro de windows en C
Publicado por: ALP 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.
Título: Registro de windows en C
Publicado por: intropedro 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
Título: Registro de windows en C
Publicado por: ALP 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.
Título: Registro de windows en C
Publicado por: intropedro 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
Título: Registro de windows en C
Publicado por: intropedro 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
Título: Registro de windows en C
Publicado por: intropedro 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
Título: Registro de windows en C
Publicado por: ALP 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.
Título: Registro de windows en C
Publicado por: intropedro 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
Título: Registro de windows en C
Publicado por: ALP 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.
Título: Registro de windows en C
Publicado por: intropedro en 05 de Septiembre de 2004, 07:42:10 pm
Ok, si que parece una mejor opcion la que me as dicho, voy a ver si me pongo a programar.

Saludos
Título: Registro de windows en C
Publicado por: intropedro en 07 de Septiembre de 2004, 01:17:46 pm
Hola, e estao mirando funciones que lean el valor de una clave del registro y e encontrao RegGetValue pero me pone Requirements Server: Requires Windows Server 2003 SP1, y e provado y no me la reconoce (tengo windows XP).  No se que funcion utilizar, ¿alguna recomendacion?

Saludos
Título: Registro de windows en C
Publicado por: ALP en 07 de Septiembre de 2004, 07:00:13 pm
La función que debes utilizar para recoger un valor del registro es RegQueryValueEx()

Un saludo.
Título: Registro de windows en C
Publicado por: intropedro en 10 de Septiembre de 2004, 01:11:18 am
Hola, he estado un poco ocupado terminado un trabajo pendiente pero ya me e puesto manos a la obra.

He hechoel codigo siguiente y cuando hay un dato antes crea una clave de copia de seguridad pero el contenido de la clave no se me escribe bien, no se si cogo mal el dato, o lo escribo mal?

Código: [Seleccionar]
HKEY key;
LONG ret_key;
DWORD tam, Disposition, BufferSize;
char abrir[128];
char *salvar_clave;

/* CREAMOS LA EXTENSION */


ret_key = RegCreateKeyEx(HKEY_CLASSES_ROOT, extension, 0, "",
                         REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS,
                         NULL, &key, &Disposition);
if (ret_key == ERROR_SUCCESS) {
BufferSize = 12;//12Bytes=12caracteres
salvar_clave = NULL;
ret_key = RegQueryValueEx(key, "", NULL, NULL,(LPBYTE) salvar_clave, &BufferSize );
if(ret_key==ERROR_SUCCESS){//Hay que guardar dato
tam = lstrlen(salvar_clave);
RegSetValueEx(key, "copia_predefinido", 0, REG_SZ, (LPBYTE) salvar_clave, tam);
printf("sdsdsdsffdf\n");
}
else{printf("Mal pedro\n");}
tam = lstrlen(programa);
ret_key = RegSetValueEx(key, "", 0, REG_SZ, (LPBYTE)programa, tam);
if (ret_key != ERROR_SUCCESS) {
       /* error !!! no se ha podido asignar el valor EXTENSION*/
  return 1;
}
RegCloseKey(key);
} else {
   /* error !!! no se ha podido crear la entrada en el registro EXTENSION*/
return 2;
}


Saludos
Título: Registro de windows en C
Publicado por: ALP en 10 de Septiembre de 2004, 08:46:16 pm
A simple vista no parece que haya nada mal, esxepto que en la función RegQueryValueEx(), presupones que el contenido de la entrada predeterminada tiene 12 bytes. Si el contenido tiene más caracteres, el valor devuelto es ERROR_MORE_DATA, y en la variable BufferSize te almacena el número de bytes que tiene la cadena en cuestión. Comprueba e imprime el valor devuelto por la función.

En el archivo winerror.h puedes encontrar las definiciones de los errores.


Un saludo.
Título: Registro de windows en C
Publicado por: intropedro en 10 de Septiembre de 2004, 11:45:31 pm
Ya lo e solucionado, probando unas cosas e intentao poner la variable salvar_clave como vector de caracteres y asi me a funcionado, tambien e quitado el salvar_clave = NULL; y e hecho que lea 128 Bytes y que el vector tenga 128 caracteres.


Saludos