Chequear valor en registy y ejecutar programa

17/11/2003 - 14:46 por Eduardo G Silva | Informe spam
Hola a todos, en realidad soy un intruso en este foro, programo hace años en
VB y PHP nunca me habia metido con C++ pero me surguio un problema que no
puedo resolver con vb y hace dos semanas que estoy internado intentando
desmarañar Visual C y si bien estoy facinado tambien estoy a punto del
colapso nervioso.

Hice una aplicacion multimedia en VB y un Instalador de dicha aplicacion
ahora bien mi cliente me pidio que tenga autorun el problema es que no puedo
hacer el autorun en VB porque para ejecutarlo antes tengo que instalar al
menos la vbrun correspondiente a la version.

Por eso comence a hacer una Win32 Console Application que lo unico que tiene
que hacer es ver es si existe una clave en la registy y si la encuentra
ejecutar un exe que se encuentra en el valor de la clave. Si no lo
encuentra tiene que ejecutar el instalador que esta en el cd. Tengo
entendido que este programita que estoy haciendo en VC no va a necesitar
registrar nada para ejecutarse.

Hasta aca todo bien el problema es que no me da la cabeza si tubiese que
hacer esto en VB agregaria una API en un modulo y invocaria la funcion en un
procedimiento.

Encontre un ejemplo navegando por ahi que ve si un valor de la registy
existe pero no entiendo como hace para incluir en el proyecto por ejemplo
RegOpenKeyEx. Creo que estoy cerca de la solucion pero me un empujoncito

Me dan una mano.

Muchas Gracias y gracias por la paciencia






void LeeClave(void)
{
HKEY key;
char subKey[] = "Software\\Mecenas-Brasil\\MuchoGusto";
char valName[] = "Instalacion"; /* ruta del exe instalado */
char val[255];
char valAca[255];
int size = sizeof(val)-1;
DWORD type = REG_SZ;

if(RegOpenKeyEx(HKEY_LOCAL_MACHINE, subKey, 0, KEY_ALL_ACCESS, &key))
MessageBox(NULL, key, "Primer mensaje", MB_OK | MB_ICONERROR);
// return;

if(RegQueryValueEx(key, valName, NULL, &type, val, &size))
{
// wsprintf(val, "%d", "que va");
// RegSetValueEx(key, valName, 0, REG_SZ, val, strlen(val));
MessageBox(NULL, "aca tendria que estar", val, MB_OK | MB_ICONERROR);
}
else
{
MessageBox(NULL, subKey, "No entro en el query", MB_OK | MB_ICONERROR);
}
RegCloseKey(key);
MessageBox(NULL, subKey, "ultimo mens", MB_OK | MB_ICONERROR);
}


begin 666 Eduardo Germán Silva.vcf
M0D5'24XZ5D-!4D0-"E9%4E-)3TXZ,BXQ#0I..E-I;'9A.T5D=6%R9&\[1V5R
M;>%N#0I&3CI%9'5A<F1O($=E<FWA;B!3:6QV80T*3D]413M%3D-/1$E.1SU1
M54]4140M4%))3E1!0DQ%.D=U/45$82!D92!U<V\@9&5L(&9O<F\Z/3!$/3!!
M:'1T<#HO+W!E<G-O+G=A;F%D;V\N97,O<G5B96YV:6=O;B]F;W)O/3!$/3!!
M#0I%34%)3#M04D5&.TE.5$523D54.D5D=6%R9&]3:6QV84!M96-E;F%S+F-O
D;0T*4D56.C(P,#,Q,3$W5#$S-#8R.5H-"D5.1#I60T%21 T*
`
end

Preguntas similare

Leer las respuestas

#1 my name
18/11/2003 - 03:00 | Informe spam
"Eduardo G Silva" wrote in
news::

Hola a todos, en realidad soy un intruso en este foro, programo hace
años en VB y PHP nunca me habia metido con C++ pero me surguio un
problema que no puedo resolver con vb y hace dos semanas que estoy
internado intentando desmarañar Visual C y si bien estoy facinado
tambien estoy a punto del colapso nervioso.

Hice una aplicacion multimedia en VB y un Instalador de dicha
aplicacion ahora bien mi cliente me pidio que tenga autorun el
problema es que no puedo hacer el autorun en VB porque para ejecutarlo
antes tengo que instalar al menos la vbrun correspondiente a la
version.




Para hacer q un CD tenga autorun no necesitas crear una aplicacion en VC,
solo tienes q crear en el directorio raiz del CD un fichero llamado
autorun.inf

[autorun]
open=Instalar.exe
icon=tuicono.ico


Por eso comence a hacer una Win32 Console Application que lo unico que
tiene que hacer es ver es si existe una clave en la registy y si la
encuentra ejecutar un exe que se encuentra en el valor de la clave.
Si no lo encuentra tiene que ejecutar el instalador que esta en el cd.
Tengo entendido que este programita que estoy haciendo en VC no va a
necesitar registrar nada para ejecutarse.

Hasta aca todo bien el problema es que no me da la cabeza si tubiese
que hacer esto en VB agregaria una API en un modulo y invocaria la
funcion en un procedimiento.



Estas funciones en VB serian:

Public Declare Function RegOpenKeyEx Lib "advapi32.dll" Alias
"RegOpenKeyExA" (ByVal hKey As Long, ByVal lpSubKey As String, ByVal
ulOptions As Long, ByVal samDesired As Long, phkResult As Long) As Long

Public Declare Function RegQueryValueEx Lib "advapi32.dll" Alias
"RegQueryValueExA" (ByVal hKey As Long, ByVal lpValueName As String, ByVal
lpReserved As Long, lpType As Long, lpData As Any, lpcbData As Long) As
Long
' Note that if you declare the lpData parameter as String, you must pass it
By Value.

Public Declare Function RegSetValueEx Lib "advapi32.dll" Alias
"RegSetValueExA" (ByVal hKey As Long, ByVal lpValueName As String, ByVal
Reserved As Long, ByVal dwType As Long, lpData As Any, ByVal cbData As
Long) As Long
' Note that if you declare the lpData parameter as String, you must pass it
By Value.

Public Declare Function RegCloseKey Lib "advapi32.dll" Alias "RegCloseKey"
(ByVal hKey As Long) As Long







Encontre un ejemplo navegando por ahi que ve si un valor de la registy
existe pero no entiendo como hace para incluir en el proyecto por
ejemplo RegOpenKeyEx. Creo que estoy cerca de la solucion pero me un
empujoncito

Me dan una mano.

Muchas Gracias y gracias por la paciencia






void LeeClave(void)
{
HKEY key;
char subKey[] = "Software\\Mecenas-Brasil\\MuchoGusto";
char valName[] = "Instalacion"; /* ruta del exe instalado */
char val[255];
char valAca[255];
int size = sizeof(val)-1;
DWORD type = REG_SZ;

if(RegOpenKeyEx(HKEY_LOCAL_MACHINE, subKey, 0, KEY_ALL_ACCESS, &key))
MessageBox(NULL, key, "Primer mensaje", MB_OK | MB_ICONERROR);
// return;




#define BUFSIZE 1024

HKEY hKey;
TCHAR val[BUFSIZE];
DWORD dwBufLen=BUFSIZE;
LONG lRet;

TCHAR subKey[] = _T("Software\\Mecenas-Brasil\\MuchoGusto");
TCHAR valName[] = _T("Instalacion"); /* ruta del exe instalado */
TCHAR val[BUFSIZE];


lRet = RegOpenKeyEx( HKEY_LOCAL_MACHINE,
subKey),
0,
KEY_QUERY_VALUE,
&hKey );

// encontrada
if( lRet == ERROR_SUCCESS )
{
// Consultar la clave del registro
lRet = RegQueryValueEx( hKey, valName, NULL, NULL,
(LPBYTE) val, &dwBufLen);


if( (lRet == ERROR_SUCCESS) || (dwBufLen < BUFSIZE) )
{

// Ejecutas el programa si se encuentra la clave

RegCloseKey( hKey );
}

}




if(RegQueryValueEx(key, valName, NULL, &type, val, &size))
{
// wsprintf(val, "%d", "que va");
// RegSetValueEx(key, valName, 0, REG_SZ, val, strlen(val));
MessageBox(NULL, "aca tendria que estar", val, MB_OK |
MB_ICONERROR);
}
else
{
MessageBox(NULL, subKey, "No entro en el query", MB_OK |
MB_ICONERROR);
}
RegCloseKey(key);
MessageBox(NULL, subKey, "ultimo mens", MB_OK | MB_ICONERROR);
}


begin 666 Eduardo Germán Silva.vcf
BEGIN:VCARD
VERSION:2.1
N:Silva;Eduardo;Germán
FN:Eduardo Germán Silva
NOTE;ENCODING=QUOTED-PRINTABLE:Guía de uso del
foro:


http://perso.wanadoo.es/rubenvigon/foro

EMAIL;PREF;INTERNET: REV:20031117T134629Z
END:VCARD
Attachment decoded: Eduardo Germán Silva.vcf
`
end





Te mando un ejemplo en VB de acceso al registro por si lo quieres manejar
de ese modo y no con VC.






Saludos
Respuesta Responder a este mensaje
#2 my name
18/11/2003 - 03:02 | Informe spam
my name wrote in
news::

Hola a todos, en realidad soy un intruso en este foro, programo hace
a¤os en VB y PHP nunca me habia metido con C++ pero me surguio un
problema que no puedo resolver con vb y hace dos semanas que estoy
internado intentando desmara¤ar Visual C y si bien estoy facinado
tambien estoy a punto del colapso nervioso.

Hice una aplicacion multimedia en VB y un Instalador de dicha
aplicacion ahora bien mi cliente me pidio que tenga autorun el
problema es que no puedo hacer el autorun en VB porque para ejecutarlo
antes tengo que instalar al menos la vbrun correspondiente a la
version.




Para hacer q un CD tenga autorun no necesitas crear una aplicacion en VC,
solo tienes q crear en el directorio raiz del CD un fichero llamado
autorun.inf

[autorun]
open=Instalar.exe
icon=tuicono.ico


Por eso comence a hacer una Win32 Console Application que lo unico que
tiene que hacer es ver es si existe una clave en la registy y si la
encuentra ejecutar un exe que se encuentra en el valor de la clave.
Si no lo encuentra tiene que ejecutar el instalador que esta en el cd.
Tengo entendido que este programita que estoy haciendo en VC no va a
necesitar registrar nada para ejecutarse.

Hasta aca todo bien el problema es que no me da la cabeza si tubiese
que hacer esto en VB agregaria una API en un modulo y invocaria la
funcion en un procedimiento.



Estas funciones en VB serian:

Public Declare Function RegOpenKeyEx Lib "advapi32.dll" Alias
"RegOpenKeyExA" (ByVal hKey As Long, ByVal lpSubKey As String, ByVal
ulOptions As Long, ByVal samDesired As Long, phkResult As Long) As Long

Public Declare Function RegQueryValueEx Lib "advapi32.dll" Alias
"RegQueryValueExA" (ByVal hKey As Long, ByVal lpValueName As String, ByVal
lpReserved As Long, lpType As Long, lpData As Any, lpcbData As Long) As
Long
' Note that if you declare the lpData parameter as String, you must pass it
By Value.

Public Declare Function RegSetValueEx Lib "advapi32.dll" Alias
"RegSetValueExA" (ByVal hKey As Long, ByVal lpValueName As String, ByVal
Reserved As Long, ByVal dwType As Long, lpData As Any, ByVal cbData As
Long) As Long
' Note that if you declare the lpData parameter as String, you must pass it
By Value.

Public Declare Function RegCloseKey Lib "advapi32.dll" Alias "RegCloseKey"
(ByVal hKey As Long) As Long







Encontre un ejemplo navegando por ahi que ve si un valor de la registy
existe pero no entiendo como hace para incluir en el proyecto por
ejemplo RegOpenKeyEx. Creo que estoy cerca de la solucion pero me un
empujoncito

Me dan una mano.

Muchas Gracias y gracias por la paciencia






void LeeClave(void)
{
HKEY key;
char subKey[] = "Software\\Mecenas-Brasil\\MuchoGusto";
char valName[] = "Instalacion"; /* ruta del exe instalado */
char val[255];
char valAca[255];
int size = sizeof(val)-1;
DWORD type = REG_SZ;

if(RegOpenKeyEx(HKEY_LOCAL_MACHINE, subKey, 0, KEY_ALL_ACCESS, &key))
MessageBox(NULL, key, "Primer mensaje", MB_OK | MB_ICONERROR);
// return;




#define BUFSIZE 1024

HKEY hKey;
TCHAR val[BUFSIZE];
DWORD dwBufLen=BUFSIZE;
LONG lRet;

TCHAR subKey[] = _T("Software\\Mecenas-Brasil\\MuchoGusto");
TCHAR valName[] = _T("Instalacion"); /* ruta del exe instalado */
TCHAR val[BUFSIZE];


lRet = RegOpenKeyEx( HKEY_LOCAL_MACHINE,
subKey),
0,
KEY_QUERY_VALUE,
&hKey );

// encontrada
if( lRet == ERROR_SUCCESS )
{
// Consultar la clave del registro
lRet = RegQueryValueEx( hKey, valName, NULL, NULL,
(LPBYTE) val, &dwBufLen);


if( (lRet == ERROR_SUCCESS) || (dwBufLen < BUFSIZE) )
{

// Ejecutas el programa si se encuentra la clave

RegCloseKey( hKey );
}

}




if(RegQueryValueEx(key, valName, NULL, &type, val, &size))
{
// wsprintf(val, "%d", "que va");
// RegSetValueEx(key, valName, 0, REG_SZ, val, strlen(val));
MessageBox(NULL, "aca tendria que estar", val, MB_OK |
MB_ICONERROR);
}
else
{
MessageBox(NULL, subKey, "No entro en el query", MB_OK |
MB_ICONERROR);
}
RegCloseKey(key);
MessageBox(NULL, subKey, "ultimo mens", MB_OK | MB_ICONERROR);
}


begin 666 Eduardo Germ n Silva.vcf
BEGIN:VCARD
VERSION:2.1
N:Silva;Eduardo;Germ n
FN:Eduardo Germ n Silva
NOTE;ENCODING=QUOTED-PRINTABLE:Guía de uso del
foro:


http://perso.wanadoo.es/rubenvigon/foro

EMAIL;PREF;INTERNET: REV:20031117T134629Z
END:VCARD
Attachment decoded: Eduardo Germ n Silva.vcf
`
end





Te mando un ejemplo en VB de acceso al registro por si lo quieres manejar
de ese modo y no con VC.






Saludos
Respuesta Responder a este mensaje
#3 Eduardo G Silva
18/11/2003 - 16:44 | Informe spam
Muchas gracias por la molestia, en vb no tengo problema de acceder a la
registry, mi problema era en C++ que hasta hace un par de dias no sabia ni
definir una variable.

El codigo que me mandaste me viene barbaro.

De la manera que me mostraste en el autorun siempre se ejecutaria el
instalador y lo que necesito es chequear si el programa ya fue instalado y
si asi fue ejecutarlo.

No lo puedo hacer en VB porque si fuese la primera vez que el usuario entra
no estarian los componentes instalados.

Con el codigo que me enviaste genero un ejecutable que determina si tiene
que ejecutar el instalador o correr el programa instalado.

Muchas Gracias





"my name" escreveu na mensagem
news:
my name wrote in
news::

> Hola a todos, en realidad soy un intruso en este foro, programo hace
> a¤os en VB y PHP nunca me habia metido con C++ pero me surguio un
> problema que no puedo resolver con vb y hace dos semanas que estoy
> internado intentando desmara¤ar Visual C y si bien estoy facinado
> tambien estoy a punto del colapso nervioso.
>
> Hice una aplicacion multimedia en VB y un Instalador de dicha
> aplicacion ahora bien mi cliente me pidio que tenga autorun el
> problema es que no puedo hacer el autorun en VB porque para ejecutarlo
> antes tengo que instalar al menos la vbrun correspondiente a la
> version.
>

Para hacer q un CD tenga autorun no necesitas crear una aplicacion en VC,
solo tienes q crear en el directorio raiz del CD un fichero llamado
autorun.inf

[autorun]
open=Instalar.exe
icon=tuicono.ico


> Por eso comence a hacer una Win32 Console Application que lo unico que
> tiene que hacer es ver es si existe una clave en la registy y si la
> encuentra ejecutar un exe que se encuentra en el valor de la clave.
> Si no lo encuentra tiene que ejecutar el instalador que esta en el cd.
> Tengo entendido que este programita que estoy haciendo en VC no va a
> necesitar registrar nada para ejecutarse.
>
> Hasta aca todo bien el problema es que no me da la cabeza si tubiese
> que hacer esto en VB agregaria una API en un modulo y invocaria la
> funcion en un procedimiento.

Estas funciones en VB serian:

Public Declare Function RegOpenKeyEx Lib "advapi32.dll" Alias
"RegOpenKeyExA" (ByVal hKey As Long, ByVal lpSubKey As String, ByVal
ulOptions As Long, ByVal samDesired As Long, phkResult As Long) As Long

Public Declare Function RegQueryValueEx Lib "advapi32.dll" Alias
"RegQueryValueExA" (ByVal hKey As Long, ByVal lpValueName As String, ByVal
lpReserved As Long, lpType As Long, lpData As Any, lpcbData As Long) As
Long
' Note that if you declare the lpData parameter as String, you must pass


it
By Value.

Public Declare Function RegSetValueEx Lib "advapi32.dll" Alias
"RegSetValueExA" (ByVal hKey As Long, ByVal lpValueName As String, ByVal
Reserved As Long, ByVal dwType As Long, lpData As Any, ByVal cbData As
Long) As Long
' Note that if you declare the lpData parameter as String, you must pass


it
By Value.

Public Declare Function RegCloseKey Lib "advapi32.dll" Alias "RegCloseKey"
(ByVal hKey As Long) As Long






>
> Encontre un ejemplo navegando por ahi que ve si un valor de la registy
> existe pero no entiendo como hace para incluir en el proyecto por
> ejemplo RegOpenKeyEx. Creo que estoy cerca de la solucion pero me un
> empujoncito
>
> Me dan una mano.
>
> Muchas Gracias y gracias por la paciencia
>
>
>
>
>
>
> void LeeClave(void)
> {
> HKEY key;
> char subKey[] = "Software\\Mecenas-Brasil\\MuchoGusto";
> char valName[] = "Instalacion"; /* ruta del exe instalado */
> char val[255];
> char valAca[255];
> int size = sizeof(val)-1;
> DWORD type = REG_SZ;
>
> if(RegOpenKeyEx(HKEY_LOCAL_MACHINE, subKey, 0, KEY_ALL_ACCESS, &key))
> MessageBox(NULL, key, "Primer mensaje", MB_OK | MB_ICONERROR);
> // return;


#define BUFSIZE 1024

HKEY hKey;
TCHAR val[BUFSIZE];
DWORD dwBufLen=BUFSIZE;
LONG lRet;

TCHAR subKey[] = _T("Software\\Mecenas-Brasil\\MuchoGusto");
TCHAR valName[] = _T("Instalacion"); /* ruta del exe instalado */
TCHAR val[BUFSIZE];


lRet = RegOpenKeyEx( HKEY_LOCAL_MACHINE,
subKey),
0,
KEY_QUERY_VALUE,
&hKey );

// encontrada
if( lRet == ERROR_SUCCESS )
{
// Consultar la clave del registro
lRet = RegQueryValueEx( hKey, valName, NULL, NULL,
(LPBYTE) val, &dwBufLen);


if( (lRet == ERROR_SUCCESS) || (dwBufLen < BUFSIZE) )
{

// Ejecutas el programa si se encuentra la clave

RegCloseKey( hKey );
}

}



>
> if(RegQueryValueEx(key, valName, NULL, &type, val, &size))
> {
> // wsprintf(val, "%d", "que va");
> // RegSetValueEx(key, valName, 0, REG_SZ, val, strlen(val));
> MessageBox(NULL, "aca tendria que estar", val, MB_OK |
> MB_ICONERROR);
> }
> else
> {
> MessageBox(NULL, subKey, "No entro en el query", MB_OK |
> MB_ICONERROR);
> }
> RegCloseKey(key);
> MessageBox(NULL, subKey, "ultimo mens", MB_OK | MB_ICONERROR);
> }
>
>
> begin 666 Eduardo Germ n Silva.vcf
> BEGIN:VCARD
> VERSION:2.1
> N:Silva;Eduardo;Germ n
> FN:Eduardo Germ n Silva
> NOTE;ENCODING=QUOTED-PRINTABLE:Guía de uso del
> foro:


http://perso.wanadoo.es/rubenvigon/foro

> EMAIL;PREF;INTERNET: REV:20031117T134629Z
> END:VCARD
> Attachment decoded: Eduardo Germ n Silva.vcf
> `
> end
>
>

Te mando un ejemplo en VB de acceso al registro por si lo quieres manejar
de ese modo y no con VC.






Saludos





Respuesta Responder a este mensaje
#4 Eduardo G Silva
18/11/2003 - 17:00 | Informe spam
El codigo que me mandaste funciona perfecto pero como hago para limpiar el
valor de la key y ponerlo en una variable?

Porque en la key esta la ruta del programa, en vb seria asi:

r = RegOpenKey(Hkey, strPath, keyhand)
lResult = RegQueryValueEx(keyhand, strValue, 0&, lValueType, ByVal 0&,
lDataBufSize)
If lValueType = REG_SZ Then
strBuf = String(lDataBufSize, " ")
lResult = RegQueryValueEx(keyhand, strValue, 0&, 0&, ByVal strBuf,
lDataBufSize)
If lResult = ERROR_SUCCESS Then
intZeroPos = InStr(strBuf, Chr$(0))
If intZeroPos > 0 Then
p_funRegBuscaString = Left$(strBuf, intZeroPos - 1)
Else
p_funRegBuscaString = strBuf
End If
End If
End If


pero no se como hacerlo en c.


Gracias, saludos
Respuesta Responder a este mensaje
#5 Eduardo G Silva
18/11/2003 - 17:12 | Informe spam
Perdon ahi lo encontre esta en "val". Sale con fritas

Gracias nuevamente.

PD: me dieron tantas ganas de aprender C++ que me voy a la libreria a
comprar algun libraco.



"Eduardo G Silva" escreveu na
mensagem news:
El codigo que me mandaste funciona perfecto pero como hago para limpiar el
valor de la key y ponerlo en una variable?

Porque en la key esta la ruta del programa, en vb seria asi:

r = RegOpenKey(Hkey, strPath, keyhand)
lResult = RegQueryValueEx(keyhand, strValue, 0&, lValueType, ByVal 0&,
lDataBufSize)
If lValueType = REG_SZ Then
strBuf = String(lDataBufSize, " ")
lResult = RegQueryValueEx(keyhand, strValue, 0&, 0&, ByVal strBuf,
lDataBufSize)
If lResult = ERROR_SUCCESS Then
intZeroPos = InStr(strBuf, Chr$(0))
If intZeroPos > 0 Then
p_funRegBuscaString = Left$(strBuf, intZeroPos - 1)
Else
p_funRegBuscaString = strBuf
End If
End If
End If


pero no se como hacerlo en c.


Gracias, saludos


Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida