consulta función en C

consulta función en C

Postby lucasdebeltran » Wed Feb 15, 2012 3:48 pm

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
Muchas gracias. Many thanks.

Un saludo, Best regards,

Harbour 3.2.0dev, Borland C++ 5.82 y FWH 13.06 [producción]

Implementando MSVC 2010, FWH64 y ADO.

Abandonando uso xHarbour y SQLRDD.
User avatar
lucasdebeltran
 
Posts: 1303
Joined: Tue Jul 21, 2009 8:12 am

Re: consulta función en C

Postby George » Wed Feb 15, 2012 5:07 pm

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
George
 
Posts: 725
Joined: Tue Oct 18, 2005 6:49 pm

Re: consulta función en C

Postby lucasdebeltran » Wed Feb 15, 2012 5:15 pm

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.
Muchas gracias. Many thanks.

Un saludo, Best regards,

Harbour 3.2.0dev, Borland C++ 5.82 y FWH 13.06 [producción]

Implementando MSVC 2010, FWH64 y ADO.

Abandonando uso xHarbour y SQLRDD.
User avatar
lucasdebeltran
 
Posts: 1303
Joined: Tue Jul 21, 2009 8:12 am

Re: consulta función en C

Postby George » Wed Feb 15, 2012 7:39 pm

Lucas,
Trata incluyendo la ruta (path) en el archivo .bat

Saludos,

George
George
 
Posts: 725
Joined: Tue Oct 18, 2005 6:49 pm

Re: consulta función en C

Postby hmpaquito » Thu Feb 16, 2012 8:35 am

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
hmpaquito
 
Posts: 1482
Joined: Thu Oct 30, 2008 2:37 pm

Re: consulta función en C

Postby Biel EA6DD » Thu Feb 16, 2012 8:53 am

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).
Saludos desde Mallorca
Biel Maimó
http://bielsys.blogspot.com/
User avatar
Biel EA6DD
 
Posts: 682
Joined: Tue Feb 14, 2006 9:48 am
Location: Mallorca

Re: consulta función en C

Postby lucasdebeltran » Thu Feb 16, 2012 10:10 am

Muchas gracias Biel.

Y nuevamente gracias por compartir tus aportes en tu blog.

¿Tu no has experimentado este problema?.
Muchas gracias. Many thanks.

Un saludo, Best regards,

Harbour 3.2.0dev, Borland C++ 5.82 y FWH 13.06 [producción]

Implementando MSVC 2010, FWH64 y ADO.

Abandonando uso xHarbour y SQLRDD.
User avatar
lucasdebeltran
 
Posts: 1303
Joined: Tue Jul 21, 2009 8:12 am

Re: consulta función en C

Postby Biel EA6DD » Thu Feb 16, 2012 11:40 am

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.
Last edited by Biel EA6DD on Thu Feb 16, 2012 12:02 pm, edited 1 time in total.
Saludos desde Mallorca
Biel Maimó
http://bielsys.blogspot.com/
User avatar
Biel EA6DD
 
Posts: 682
Joined: Tue Feb 14, 2006 9:48 am
Location: Mallorca

Re: consulta función en C

Postby lucasdebeltran » Thu Feb 16, 2012 11:51 am

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.
Muchas gracias. Many thanks.

Un saludo, Best regards,

Harbour 3.2.0dev, Borland C++ 5.82 y FWH 13.06 [producción]

Implementando MSVC 2010, FWH64 y ADO.

Abandonando uso xHarbour y SQLRDD.
User avatar
lucasdebeltran
 
Posts: 1303
Joined: Tue Jul 21, 2009 8:12 am

Re: consulta función en C

Postby George » Fri Feb 17, 2012 5:52 pm

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
George
 
Posts: 725
Joined: Tue Oct 18, 2005 6:49 pm

Re: consulta función en C

Postby lucasdebeltran » Wed Feb 22, 2012 4:35 pm

Biel,

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

Muchas gracias.
Muchas gracias. Many thanks.

Un saludo, Best regards,

Harbour 3.2.0dev, Borland C++ 5.82 y FWH 13.06 [producción]

Implementando MSVC 2010, FWH64 y ADO.

Abandonando uso xHarbour y SQLRDD.
User avatar
lucasdebeltran
 
Posts: 1303
Joined: Tue Jul 21, 2009 8:12 am

Re: consulta función en C

Postby Frafive » Fri Feb 24, 2012 8:45 am

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
Frafive
 
Posts: 189
Joined: Wed Apr 05, 2006 9:48 pm

Re: consulta función en C

Postby Daniel Garcia-Gil » Fri Feb 24, 2012 1:20 pm

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
User avatar
Daniel Garcia-Gil
 
Posts: 2365
Joined: Wed Nov 02, 2005 11:46 pm
Location: Isla de Margarita

Re: consulta función en C

Postby lucasdebeltran » Fri Feb 24, 2012 3:33 pm

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]
Muchas gracias. Many thanks.

Un saludo, Best regards,

Harbour 3.2.0dev, Borland C++ 5.82 y FWH 13.06 [producción]

Implementando MSVC 2010, FWH64 y ADO.

Abandonando uso xHarbour y SQLRDD.
User avatar
lucasdebeltran
 
Posts: 1303
Joined: Tue Jul 21, 2009 8:12 am

Re: consulta función en C

Postby Daniel Garcia-Gil » Fri Feb 24, 2012 4:05 pm

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;
}
User avatar
Daniel Garcia-Gil
 
Posts: 2365
Joined: Wed Nov 02, 2005 11:46 pm
Location: Isla de Margarita

Next

Return to FiveWin para Harbour/xHarbour

Who is online

Users browsing this forum: No registered users and 19 guests