Page 4 of 6

Re: Migrando de FWH 32 a FWH 64 - windows.h

PostPosted: Tue Jan 06, 2015 9:08 am
by Verhoven
El error de quedarse colgado al salir del programa ha vuelto a reproducirse, no se que ha pasado de ayer a hoy porque no hemos tocado nada de código. Incluso aun comentando línea por línea o toda la EXIT PROCEDURE KillApp() entera se queda colgado al salir.
Necesito que me orientes para depurar este problema que en 32 bits no aparece porque no se como.
Lo único que he encontrado es que cuando el windows me remite a depurar con el VSC me sale una pantalla en la que me da el nombre del programa con un número. Suponiendo que ese número correspondiera con un número de línea del programa resulta referirse a una instrucción sysrefresh().

Re: Migrando de FWH 32 a FWH 64 - windows.h

PostPosted: Tue Jan 06, 2015 10:27 am
by lucasdebeltran
Hola;

Aquí puedes ver usando las funciones nativas de Harbour / xHarbour la forma de saber si hay conexión a Internet:

PROCEDURE Main
LOCAL pSocket

INetInit()

pSocket := INetConnect( "www.xharbour.com", 80 )

? INetAddress( pSocket ) // result: 193.239.210.10

INetClose( pSocket )
INetCleanUp()
RETURN

Espero que te sirva.

Re: Migrando de FWH 32 a FWH 64 - windows.h

PostPosted: Tue Jan 06, 2015 10:33 am
by Antonio Linares
Paz,

Te falta incluir este include en tu fichero en C:

#include <hbapifs.h>

No uses un EXIT procedure, no hace falta y de ahí puede venir el problema.

Cualquier limpieza que quieras hacer hazla tras el ACTIVATE WINDOW ... del PRG principal y verás como no tienes ningún problema :-)

Re: Migrando de FWH 32 a FWH 64 - windows.h

PostPosted: Tue Jan 06, 2015 10:36 am
by lucasdebeltran
Paz,

Veo que estás usando dlls de 32 bits y en 64 bits no es posible:

//freelibrary("nviewlib.dll")
//freelibrary("avicap32.dll")

Tampoco Fast Report funciona en 64 bits.

Re: Migrando de FWH 32 a FWH 64 - windows.h

PostPosted: Tue Jan 06, 2015 11:06 am
by Verhoven
Antonio, tengo incluido ese include. Creo que no lo has visto. Está en la lista de includes justo debajo de #PRAGMA BEGINDUMP.

Otra forma de eliminar esos warnings para fopen y otras funciones "standard" de C con VSC2013 es incluir las siguientes líneas en el código C:
Code: Select all  Expand view
#pragma warning(disable: 4996)

Re: Migrando de FWH 32 a FWH 64 - windows.h

PostPosted: Tue Jan 06, 2015 4:20 pm
by Antonio Linares
Paz,

Es que has escrito hb_fsopen() y en realidad es hb_fsOpen()

Cámbialo y vuelve a compilarlo :-)

Re: Migrando de FWH 32 a FWH 64 - hb_fsOpen() fopen() en C

PostPosted: Tue Jan 06, 2015 6:44 pm
by Verhoven
Antonio, con la O mayúscula lo acepta.

Pero por dejar documentado el cambio completo que ha sido necesario:
Para usar hb_fsOpen() en vez de fopen() además de añadir en los includes #include <hbapifs.h> y #include <fileio.ch>, hay que hacer una conversión de tipo para hb_fsOpen() para evitar otro warning.
De modo que si el código original con fopen() era por ejemplo:
Code: Select all  Expand view
FILE *fichero;
    char nombre[12] = "LISTFTP.DAT";
    fichero = fopen( nombre, "w" );

La versión con hb_fsOpen() debe de escribirse:
Code: Select all  Expand view
FILE *fichero;
    char nombre[12] = "LISTFTP.DAT";
    fichero = (FILE *) hb_fsOpen( nombre, FO_WRITE );


Sin esto, al compilar, nos da el siguiente error:
Code: Select all  Expand view
internet.prg(461) : warning C4047: '=' : 'FILE *' differs in levels of indirection from 'HB_FHANDLE'


Y no obstante, no estoy seguro de si además sería conveniente hacer una conversión de tipos de las variables que se le pasan a hb_fsOpen(), pues creo que el prototipo de esta función es: hb_fsOpen( BYTE * pszFileName, USHORT uiFlags ) --> ( FHANDLE )hResult
y tengo dudas de que si la variable "nombre" apunta a una matriz de 12 posiciones (que es lo que usamos en el primer parámetro de la función fopen) esto sea lo mismo en tamaño que un puntero tipo BYTE (que es el primer parámetro de hb_fsOpen).

Re: Migrando de FWH 32 a FWH 64 - windows.h

PostPosted: Tue Jan 06, 2015 7:11 pm
by Antonio Linares
Paz,

Esas 3 líneas las podrías agrupar en una sola:

FILE * fichero = ( FILE *) hb_fsOpen( "LISTFTP.DAT", FO_WRITE );

Re: Migrando de FWH 32 a FWH 64 - windows.h

PostPosted: Tue Jan 06, 2015 8:37 pm
by Verhoven
Hecho. :) Queda mejor!!!

Me queda ver lo del cuelgue de la salida del programa que no termina de salir bien y quedará terminado el paso a 64 bits.
A ver si mañana se me da mejor porque hoy no termino de dar con el problema, a pesar de haber reestructurado el proceso de cierre para ponerlo todo antes del oWnd:end() siendo oWnd el objeto ventana principal de la aplicación.

Re: Migrando de FWH 32 a FWH 64 - windows.h

PostPosted: Wed Jan 07, 2015 6:35 am
by Antonio Linares
Paz,

Lo que quieras cerrar, liberar, etc. hazlo despues del ACTIVATE WINDOW oWnd principal.

Es el lugar correcto :-)

Re: Migrando de FWH 32 a FWH 64 - windows.h

PostPosted: Wed Jan 07, 2015 10:43 pm
by Verhoven
Antonio,
Para tratar de aislar el cuelgue de la aplicación al salir he llegado a eliminar, para intentar aislar el problema, todo el proceso de cierre. Dejándolo exclusivamente en un oWnd:end(), donde oWnd es la ventana principal del programa.
Compilada en 32 bits con bcc63 no se cuelga al salir, pero en 64 con VSC 2013 si.
No se por donde puedo continuar para aislar el problema.
Por si puede ayudar utilizo 2 timers en la aplicación (no creo que tenga nada que ver pero lo dejo dicho por si acaso).

Re: Migrando de FWH 32 a FWH 64 - windows.h

PostPosted: Wed Jan 07, 2015 10:56 pm
by cnavarro
Hola, no te genera un fichero hb_out.log ?

Re: Migrando de FWH 32 a FWH 64 - windows.h

PostPosted: Thu Jan 08, 2015 7:29 am
by Verhoven
No. No encuentro ese fichero por ninguna parte.

Re: Migrando de FWH 32 a FWH 64 - windows.h

PostPosted: Thu Jan 08, 2015 2:58 pm
by Verhoven
Al fin ha quedado solucionado el cuelgue al salir de la aplicación en 64 bits:
Código que genera el cuelgue:
Code: Select all  Expand view
ACTIVATE WINDOW oWnd MAXIMIZED ON INIT ( oWnd:setfont(oFontDoble),  Arranque(oWnd),  oBtnV:setfocus() ) ;
      VALID (iif(GetKeyState (VK_ESCAPE), .F.,oWnd:End()))


Código que elimina el cuelgue (quitar todo el VALID):
Code: Select all  Expand view
ACTIVATE WINDOW oWnd MAXIMIZED ON INIT ( oWnd:setfont(oFontDoble),  Arranque(oWnd),  oBtnV:setfocus() )

Re: Migrando de FWH 32 a FWH 64 - windows.h

PostPosted: Thu Jan 08, 2015 3:33 pm
by cnavarro
Quizas quitando solo el oWnd:End() sea suficiente, asi
Code: Select all  Expand view

VALID ( iif(GetKeyState (VK_ESCAPE), .F., .T. ) )