MULTIMEDIA, Video digital, Grabación, Diseño gráfico, Diseño web, Programación > Webmasters - Diseño Web - Programación - Diseño gráfico
Registro de windows en C
intropedro:
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
intropedro:
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
ALP:
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);
--- Fin de la cita ---
--- Código: ---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 */
}
--- Fin del código ---
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.
intropedro:
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: ---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*/
}
--- Fin del código ---
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
ALP:
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.
Navegación
[#] Página Siguiente
[*] Página Anterior
Ir a la versión completa