Page 1 of 2

consulta función en C

PostPosted: Wed Feb 15, 2012 3:48 pm
by lucasdebeltran
Hola,

Estoy probado el sistema de updates automáticas de Bielsys
http://bielsys.blogspot.com/2009/04/act ... ca-de.html


El sistema suele funcionar. Siempre baja el .EXE correctamente.

Pero a la hora de renombrar en tiempo de ejecución tmp.exe por el NOMBREDELPROGRAMA.EXE, no siempre funciona.

El código en C es el siguiente:

Code: Select all  Expand view
#include "stdio.h"
#include "windows.h"

int main( int argc, char *argv[])
{

printf("Actualizando el programa. Por favor, espere unos instantes...\n");

Sleep(700);
DeleteFile( argv[1]);
rename( "tmp.exe",argv[1]);
WinExec(argv[1],1);
return EXIT_SUCCESS;

}

 



Pasa tanto en XP o Windows 7. Y también verifiqué los permisos (Administrador).

¿Alguna idea?.

Muchas gracias compañeros

Re: consulta función en C

PostPosted: Wed Feb 15, 2012 5:07 pm
by George
Con el codigo de mas abajo, al inicio de la funcion main(), y un archivo BAT puedes hacer el truco.
Code: Select all  Expand view

cAppliDir := alltrim(curdrive())+":\"+ alltrim(curdir())  /* Directorio donde reside la aplicacion */
cOrigAppli := upper(alltrim(cAppliDir)) + "
\YOUR_PROGRAM.EXE"  /* Nombre de la aplicacion */

IF upper((alltrim(hb_argv( 0 )))) <> cOrigAppli
    msginfo("
New software has been downloaded from server." + chr(13) + "Please re-start the program." )
    WinExec( "
REN_APP.BAT" )  /* Ejecutar el archivo .BAT */
    syswait(3)
    Fin()
ENDIF

FUNCTION Fin(hDll) /*  Cerrar la aplicacion */
  SET 3DLOOK OFF
  DbCloseAll()
  FreeLibrary( hDLL )
  ExitProcess()
RETURN TRUE

Code: Select all  Expand view

// REN_APP.BAT - Este es el archivo .BAT
ERASE "YOUR_PROGRAM.EXE"
RENAME "TMP.EXE" "YOUR_PROGRAM.EXE"


Saludos,

George

Re: consulta función en C

PostPosted: Wed Feb 15, 2012 5:15 pm
by lucasdebeltran
Hola,

Muchas gracias pero no funciona.

Yo ejecuto demo.exe, llamo al bat y me dice acceso denegado.

La función en c sobreescribe, en tiempo de ejecución, demo.exe, pero no siempre funciona.

Re: consulta función en C

PostPosted: Wed Feb 15, 2012 7:39 pm
by George
Lucas,
Trata incluyendo la ruta (path) en el archivo .bat

Saludos,

George

Re: consulta función en C

PostPosted: Thu Feb 16, 2012 8:35 am
by hmpaquito
Lucas,

Si no entiendo mal, el problema es borrar/ sobreescribir el .exe en "caliente". Siempre he tenido auténticos problemas con ese tema. En algunos sistemas funciona: Novel, en otros a veces o según yo qué sé: Windows. Entiendo que esto no tiene una solución directa, aunque si una indirecta.

Saludos

Re: consulta función en C

PostPosted: Thu Feb 16, 2012 8:53 am
by Biel EA6DD
El problema puede que se deba a que la aplicación que vas a borrar, todavia está activa. Prueba a incrementar el tiempo de espera antes de borrar(sleep).

Re: consulta función en C

PostPosted: Thu Feb 16, 2012 10:10 am
by lucasdebeltran
Muchas gracias Biel.

Y nuevamente gracias por compartir tus aportes en tu blog.

¿Tu no has experimentado este problema?.

Re: consulta función en C

PostPosted: Thu Feb 16, 2012 11:40 am
by Biel EA6DD
Hola Lucas,
yo no he detectado problemas, pero tal cual esta programada la función podria dar ese problema, y ademas ser aleatorio dependiendo de si le da tiempo o no a terminar la aplicacíón.

La función en C es tremendamente sencilla y así queria que fuese para no ocupar mucho espacio al embeberla en nuestro programa, en cualquier caso se le puede hacer un pequeó añadido para que chequee si el programa que quieres eliminar esta en memória.

No lo tengo hecho, pero basicamente se trataria de crear un mutex con CreateMutex(NULL, TRUE ,"path/aplicaci.exe"), y comprobar GetLastError(), si es igual a ERROR_ALREADY_EXISTS, la aplicación todavia esta activa.

Re: consulta función en C

PostPosted: Thu Feb 16, 2012 11:51 am
by lucasdebeltran
Hola Biel,

Muchas gracias nuevamente por contestar. Yo de C no tengo ni idea.

Segun veo, sleep() equivale a inkey().

La función en C hace:

Sleep(700); -> inkey(x segundos)
DeleteFile( argv[1]); ->borra el exe de la aplicación
rename( "tmp.exe",argv[1]); ->renombra tmp.exe al exe de la aplicación
WinExec(argv[1],1); -> ejecuta de nuevo la aplicación


Pero, ¿dónde está la función que fuerza a salir de la aplicación?.

Muchas gracias y perdona las molestias.

Re: consulta función en C

PostPosted: Fri Feb 17, 2012 5:52 pm
by George
Lucas,
Con relacion al mensaje "access denied" debes verificar los permisos de acceso al folder donde esta el archivo que quieres borrar.
Windows 7 tiene un sistema de seguridad que bloquea este tipo de acciones (borrar archivos), a menos que les de los permisos adecuados.

Saludos,

George

Re: consulta función en C

PostPosted: Wed Feb 22, 2012 4:35 pm
by lucasdebeltran
Biel,

Por favor, ¿cuando puedas puedes indicar cómo se haría lo de geterror() en c?.

Muchas gracias.

Re: consulta función en C

PostPosted: Fri Feb 24, 2012 8:45 am
by Frafive
Hola

Tengo el mismo problema que Lucas, algunas veces no renombra el exe y el programa de actualización entra en un bucle.

Un saludo

Re: consulta función en C

PostPosted: Fri Feb 24, 2012 1:20 pm
by Daniel Garcia-Gil
Hola

prueba de esta manera

Code: Select all  Expand view
#include "stdio.h"
#include "windows.h"

int main( int argc, char *argv[])
{
   while( ! DeleteFile( argv[ 2 ] ) ){
     Sleep( 700 );
     if( GetLastError() == ERROR_FILE_NOT_FOUND )
       break;
   }      
   rename( argv[ 1 ], argv[ 2 ] );
   WinExec( argv[ 2 ], 1 );
   return EXIT_SUCCESS;
}
 

newver <source> <destination>

ese es el exe que yo uso... es muy pequeño en comparacion al que hace borland
http://www.danielgarciagil.com/fivewin/files/newver.zip

Re: consulta función en C

PostPosted: Fri Feb 24, 2012 3:33 pm
by lucasdebeltran
Muchas gracias Daniel.

Me gustaría añadir un mensaje de texto.

¿Cómo sería en C MessageBox( 0, "ERROR: No puedo actualizar el programa "+argv[1], "Error", 0 ); ?

Es decir, no me deja añadir +argv[1]

Re: consulta función en C

PostPosted: Fri Feb 24, 2012 4:05 pm
by Daniel Garcia-Gil
Lucas

agregado 2 parametros mas

la forma de usarse es:

newver <source> <destination> <iTimesToCheck> <cMessage>

<source> = nombre del archivo que sera renombrado
<destination> = nombre del nuevo archivo
<iTimesToCheck> = veces que ejecutara la operacion mietras se genere error
<cMessage> = mensaje personalizado de error

no lo he probado en tiempo real... solo ejecute esta funcion desde consola... verifica que el argumento <cMessage> talvez tengas que enviarlo entre comillas
ejemplo
Code: Select all  Expand view
WinExec( "newver.exe " + ::cFilename +".psh " +  ::cFilename + ".exe" + " 5 " + " 'Mensaje personalizado' " )


Code: Select all  Expand view
#include "stdio.h"
#include "windows.h"

int main( int argc, char *argv[])
{
     int iTimes = 0, i = 0;
     char cMsg[ 512 ];
     BOOL lRet;
     
     iTimes = atoi( argv[ 3 ] );
          
   while( ! ( lRet = DeleteFile( argv[ 2 ] ) ) ){
     Sleep( 700 );
     if( GetLastError() == ERROR_FILE_NOT_FOUND )
       break;
     i++;
     if( iTimes != 0 && i > iTimes )
        break;
   }      
   if( lRet ){
      rename( argv[ 1 ], argv[ 2 ] );
      WinExec( argv[ 2 ], 1 );
   }else {
      if( strlen( argv[ 4 ] ) == 0 )
         sprintf( cMsg, "%s", "No fue posible completar la operacion" );
      else        
         sprintf( cMsg, "%s", argv[ 4 ] );
      MessageBox( 0, cMsg, "Informacion", MB_ICONINFORMATION | MB_OK );
    }
   return EXIT_SUCCESS;
}