FiveTech Support Forums

FiveWin / Harbour / xBase community
Board index FiveWin para Harbour/xHarbour consulta funci贸n en C
Posts: 1303
Joined: Tue Jul 21, 2009 08:12 AM
consulta funci贸n en C
Posted: Wed Feb 15, 2012 03: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 (fw): Select all Collapse
#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.
Posts: 729
Joined: Tue Oct 18, 2005 06:49 PM
Re: consulta funci贸n en C
Posted: Wed Feb 15, 2012 05:07 PM
Con el codigo de mas abajo, al inicio de la funcion main(), y un archivo BAT puedes hacer el truco.
Code (fw): Select all Collapse
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 (fw): Select all Collapse
// REN_APP.BAT - Este es el archivo .BAT
ERASE "YOUR_PROGRAM.EXE"
RENAME "TMP.EXE" "YOUR_PROGRAM.EXE"


Saludos,

George
Posts: 1303
Joined: Tue Jul 21, 2009 08:12 AM
Re: consulta funci贸n en C
Posted: Wed Feb 15, 2012 05: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.
Posts: 729
Joined: Tue Oct 18, 2005 06:49 PM
Re: consulta funci贸n en C
Posted: Wed Feb 15, 2012 07:39 PM

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

Saludos,

George

Posts: 1515
Joined: Thu Oct 30, 2008 02:37 PM
Re: consulta funci贸n en C
Posted: Thu Feb 16, 2012 08: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

Posts: 682
Joined: Tue Feb 14, 2006 09:48 AM
Re: consulta funci贸n en C
Posted: Thu Feb 16, 2012 08: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/
Posts: 1303
Joined: Tue Jul 21, 2009 08:12 AM
Re: consulta funci贸n en C
Posted: 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.
Posts: 682
Joined: Tue Feb 14, 2006 09:48 AM
Re: consulta funci贸n en C
Posted: 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.

Saludos desde Mallorca
Biel Maim贸
http://bielsys.blogspot.com/
Posts: 1303
Joined: Tue Jul 21, 2009 08:12 AM
Re: consulta funci贸n en C
Posted: 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.
Posts: 729
Joined: Tue Oct 18, 2005 06:49 PM
Re: consulta funci贸n en C
Posted: Fri Feb 17, 2012 05: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

Posts: 1303
Joined: Tue Jul 21, 2009 08:12 AM
Re: consulta funci贸n en C
Posted: Wed Feb 22, 2012 04: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.
Posts: 189
Joined: Wed Apr 05, 2006 09:48 PM
Re: consulta funci贸n en C
Posted: Fri Feb 24, 2012 08: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

Posts: 2365
Joined: Wed Nov 02, 2005 11:46 PM
Re: consulta funci贸n en C
Posted: Fri Feb 24, 2012 01:20 PM
Hola

prueba de esta manera

Code (fw): Select all Collapse
#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
Posts: 1303
Joined: Tue Jul 21, 2009 08:12 AM
Re: consulta funci贸n en C
Posted: Fri Feb 24, 2012 03: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.
Posts: 2365
Joined: Wed Nov 02, 2005 11:46 PM
Re: consulta funci贸n en C
Posted: Fri Feb 24, 2012 04: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 (fw): Select all Collapse
WinExec( "newver.exe " + ::cFilename +".psh " +  ::cFilename + ".exe" + " 5 " + " 'Mensaje personalizado' " )


Code (fw): Select all Collapse
#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;
}