FiveTech Support Forums

FiveWin / Harbour / xBase community
Board index FiveWin para Harbour/xHarbour Borland7 versus VisualStudio
Posts: 654
Joined: Mon May 29, 2006 03:14 PM
Re: Borland7 versus VisualStudio
Posted: Wed Mar 16, 2016 09:22 PM
Quitando PASCAL me da el error de "Programa.exe dejo de funcionar..." usando tanto GetBinaryTypeW como GetBinaryTypeA.

Despu茅s de mucho probar por fin he conseguido que funcione pero usando c贸digo C con #pragma BEGINDUMP/ENDDUMP.

Gracias por tu ayuda, siempre se aprenden cosas.

Y despu茅s de los desvelos la satisfacci贸n de poder "donar" el c贸digo al mundo mundial... aqu铆 os lo dejo:
Code (fw): Select all Collapse
******************************************************************************
* 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽*
* 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽GetBinaryType 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 *
* 聽 聽 聽 聽https://msdn.microsoft.com/en-us/library/aa364819(VS.85).aspx 聽 聽 聽 *
* 聽Determina el tipo de fichero ejecutable: MS-DOS, 16bits, 32bts, 64bits... *
* 聽 聽 聽 聽 聽 聽 聽 聽 聽 漏 JmGarcia 2016 (BCC7 o VS12 y FHW1602) 聽 聽 聽 聽 聽 聽 聽 聽 聽*
* 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽*
******************************************************************************

#include "FiveWin.Ch"

FUNCTION main()
public cFichero:="",nTipo:=-1

cFichero:=cGetFile("Ficheros (*.exe)|*.exe|Ficheros (*.com)|*.com|Todos (*.*)|*.*","Escoja fichero ejecutable")
cFichero:=alltrim(cFichero)
nTipo:=GetBinaryType(cFichero)
do case
聽 聽case nTipo=0 ; MsgInfo("Ejecutable de 32 bits")
聽 聽case nTipo=1 ; MsgInfo("Ejecutable MS-DOS")
聽 聽case nTipo=2 ; MsgInfo("Ejecutable de 16 bits")
聽 聽case nTipo=3 ; MsgInfo("Ejecutable PIF/MS-DOS")
聽 聽case nTipo=4 ; MsgInfo("Ejecutable POSIX")
聽 聽case nTipo=5 ; MsgInfo("Ejecutable de 16 OS/2")
聽 聽case nTipo=6 ; MsgInfo("Ejecutable de 64 bits")
otherwise
聽 聽MsgInfo("Tipo de fichero/ejecutable desconocido")
endcase
return nil

#pragma BEGINDUMP
#include <windows.h>
#include "hbapi.h"
#include "hbapierr.h"
HB_FUNC( GETBINARYTYPE )
{
聽DWORD dwBinaryType;
聽GetBinaryType(hb_parc(1),&dwBinaryType);
聽hb_retni(dwBinaryType);
}
#pragma ENDDUMP

No descarto conseguir hacer que funcione wrapeando lo de DLL32 FUNCTION... :-) :-)
Mi abuelo dec铆a: Los aviones vuelan porque Dios quiere, y los helic贸pteros ni Dios sabe porque vuelan.

FWH 16.02, xHarbour 1.2.3, Harbour 3.2.0, WorkShop 4.5, AJ Make 0.30, Borlan BCC 7.00, VisualStudio 2013
Posts: 44158
Joined: Thu Oct 06, 2005 05:47 PM
Re: Borland7 versus VisualStudio
Posted: Wed Mar 16, 2016 09:35 PM

JM,

gracias!

No consigo que funcione con DLL FUNCTION. He estado prob谩ndolo
de varias formas pero no va :-(

Tendr茅 que tracear el c贸digo a bajo nivel para ver que ocurre...

regards, saludos

Antonio Linares
www.fivetechsoft.com
Posts: 654
Joined: Mon May 29, 2006 03:14 PM
Re: Borland7 versus VisualStudio
Posted: Wed Mar 16, 2016 09:39 PM

Gracias a ti por tu ayuda :D

Mi abuelo dec铆a: Los aviones vuelan porque Dios quiere, y los helic贸pteros ni Dios sabe porque vuelan.

FWH 16.02, xHarbour 1.2.3, Harbour 3.2.0, WorkShop 4.5, AJ Make 0.30, Borlan BCC 7.00, VisualStudio 2013
Posts: 6755
Joined: Wed Feb 15, 2012 08:25 PM
Re: Borland7 versus VisualStudio
Posted: Wed Mar 16, 2016 11:48 PM
Pru茅balo asi:

Code (fw): Select all Collapse
DLL32 FUNCTION GetBinaryType( cFile AS LPSTR, @nType AS DWORD ) AS LONG PASCAL FROM "GetBinaryTypeA" LIB "Kernel32.dll"

Function Tipo()

  local cFichero := "d:\fwh\fwhteam\samples\prucmenu.exe"
  //local cFichero := "d:\fwh\samples\tutor01.exe"
  local nTipo    := 0

  GetBinaryType( cFichero, @nTipo )
  MsgInfo( nTipo, "Tipo de fichero" )

return nil
Cristobal Navarro

Hay dos tipos de personas: las que te hacen perder el tiempo y las que te hacen perder la noci贸n del tiempo

El secreto de la felicidad no est谩 en hacer lo que te gusta, sino en que te guste lo que haces
Posts: 44158
Joined: Thu Oct 06, 2005 05:47 PM
Re: Borland7 versus VisualStudio
Posted: Thu Mar 17, 2016 08:18 AM

Cristobal,

Genial!

Esta funcionando bien, muchas gracias :-)

regards, saludos

Antonio Linares
www.fivetechsoft.com
Posts: 1516
Joined: Thu May 27, 2010 02:06 PM
Re: Borland7 versus VisualStudio
Posted: Thu Mar 17, 2016 09:02 AM
Aqui esto parece que funciona bien ...
Code (fw): Select all Collapse
Function Tipo(cExe)

  local cFichero := cExe
   local nTipo    := 0

  nTipo := GetBinaryType( cFichero )
  
  MsgInfo( nTipo, "Tipo de fichero" )

return nil


#pragma BEGINDUMP
#include <windows.h>
#include "hbapi.h"
#include "hbapierr.h"

HB_FUNC( GETBINARYTYPE )
{
 LPCTSTR lpApplicationName = ( LPCTSTR ) hb_parc( 1 ) ;
 DWORD dwBinaryType;
 GetBinaryType(lpApplicationName,&dwBinaryType) ;
 hb_retni( dwBinaryType  ) ;
}
#pragma ENDDUMP
Posts: 654
Joined: Mon May 29, 2006 03:14 PM
Re: Borland7 versus VisualStudio
Posted: Thu Mar 17, 2016 02:56 PM
cnavarro wrote:DLL32 FUNCTION GetBinaryType( cFile AS LPSTR, @nType AS DWORD ) AS LONG PASCAL FROM "GetBinaryTypeA" LIB "Kernel32.dll"
Desconoc铆a que se pudieran poner variables pasadas por referencia en el wrapeado de funciones de una DLL.
Esto me ha funciona perfectamente :-) :-)

De hecho, yo, cuando son string pasadas por referencia las defino en la DLL32... as铆 "...AS LPSTR" y en la llamada a la funci贸n (en c贸digo FWH) s铆 la pongo por referencia (@). Quiere pues decir que podr铆a definirla, en la DLL32..., como AS STRING pasada por referencia y en la llamada, por supuesto, tambi茅n por referencia.

Lo escribo.

Yo hago/hac铆a esto:
FuncionDll( @cTexto, nValor)
.../...
DLL32 FUNCTION FuncionDll( Variable1 AS LPSTR, Variable2 AS INT ) AS LONG PASCAL FROM "FuncionDllA" LIB "Libreria.dll"

Entiendo que se puede hacer as铆:
FuncionDll( @cTexto, nValor)
.../...
DLL32 FUNCTION FuncionDll( @Variable1 AS STRING, Variable2 AS INT ) AS LONG PASCAL FROM "FuncionDllA" LIB "Libreria.dll"


Mas "fino" este c贸digo C :-)
mastintin wrote:HB_FUNC( GETBINARYTYPE )
{
LPCTSTR lpApplicationName = ( LPCTSTR ) hb_parc( 1 ) ;
DWORD dwBinaryType;
GetBinaryType(lpApplicationName,&dwBinaryType) ;
hb_retni( dwBinaryType ) ;
}
#pragma ENDDUMP


Gracias a todos.
Mi abuelo dec铆a: Los aviones vuelan porque Dios quiere, y los helic贸pteros ni Dios sabe porque vuelan.

FWH 16.02, xHarbour 1.2.3, Harbour 3.2.0, WorkShop 4.5, AJ Make 0.30, Borlan BCC 7.00, VisualStudio 2013
Posts: 654
Joined: Mon May 29, 2006 03:14 PM
Re: Borland7 versus VisualStudio
Posted: Thu Mar 17, 2016 09:40 PM

El programa compilado en 64 bits (VS12) no funciona con la opci贸n de wrapear con DLL32 FUNCTION... s铆 funciona con la opci贸n de insertar c贸digo C (BEGINDUMP/ENDDUMP).

El programa se ejecuta, aparece la ventana de cGetFile, se escoge el fichero deseado <intro> y... no aparece nada y al rato termina la ejecuci贸n.

驴Alguna idea?

Mi abuelo dec铆a: Los aviones vuelan porque Dios quiere, y los helic贸pteros ni Dios sabe porque vuelan.

FWH 16.02, xHarbour 1.2.3, Harbour 3.2.0, WorkShop 4.5, AJ Make 0.30, Borlan BCC 7.00, VisualStudio 2013
Posts: 6755
Joined: Wed Feb 15, 2012 08:25 PM
Re: Borland7 versus VisualStudio
Posted: Thu Mar 17, 2016 10:30 PM
No lo he probado

Code (fw): Select all Collapse
DLL32 FUNCTION GetBinaryType( cFile AS LPSTR, @nType AS DWORD ) AS LONGLONG PASCAL FROM "GetBinaryTypeW" LIB "Kernel32.dll"

Function Tipo()

  local cFichero := "d:\fwh\fwhteam\samples\prucmenu.exe"
  //local cFichero := "d:\fwh\fwhteam\samples\scilex64.dll"
  local nTipo    := 0

  GetBinaryType( cFichero, @nTipo )
  MsgInfo( nTipo, "Tipo de fichero" )

return nil
Cristobal Navarro

Hay dos tipos de personas: las que te hacen perder el tiempo y las que te hacen perder la noci贸n del tiempo

El secreto de la felicidad no est谩 en hacer lo que te gusta, sino en que te guste lo que haces
Posts: 44158
Joined: Thu Oct 06, 2005 05:47 PM
Re: Borland7 versus VisualStudio
Posted: Fri Mar 18, 2016 07:28 AM

JM,

Aqui funciona bien el c贸digo que ha publicado Cristobal:

viewtopic.php?p=187982#p187982

regards, saludos

Antonio Linares
www.fivetechsoft.com
Posts: 654
Joined: Mon May 29, 2006 03:14 PM
Re: Borland7 versus VisualStudio
Posted: Fri Mar 18, 2016 10:52 AM
A mi no me funciona si dejo la parte de c贸digo DLL32 FUNCTION... al principio del programa, antes del main().
Si la parte de c贸digo DLL32 FUNCTION... la pongo despu茅s del return nil funciona. Todo esto en 32 bits.

El ejemplo de Crist贸bal no me funciona en 64 bits.

Es decir, se repite lo que dije en mi mensaje anterior:
JmGarcia wrote:El programa compilado en 64 bits (VS12) no funciona con la opci贸n de wrapear con DLL32 FUNCTION... s铆 funciona con la opci贸n de insertar c贸digo C (BEGINDUMP/ENDDUMP)....

Parece ser que las DLL32 FUNCTION... no se llevan bien con los 64 bits de Visual Studio.
Seguiremos investigando.
Gracias a todos.
Mi abuelo dec铆a: Los aviones vuelan porque Dios quiere, y los helic贸pteros ni Dios sabe porque vuelan.

FWH 16.02, xHarbour 1.2.3, Harbour 3.2.0, WorkShop 4.5, AJ Make 0.30, Borlan BCC 7.00, VisualStudio 2013
Posts: 44158
Joined: Thu Oct 06, 2005 05:47 PM
Re: Borland7 versus VisualStudio
Posted: Fri Mar 18, 2016 11:07 AM

JM,

Si, la declaraci贸n de DLL FUNCTION hay que hacerla despues de function Main()

Efectivamente con 64 bits esta generando una excepci贸n y se crea el fichero hb_out.log

Voy a revisarlo, gracias :-)

regards, saludos

Antonio Linares
www.fivetechsoft.com
Posts: 44158
Joined: Thu Oct 06, 2005 05:47 PM
Re: Borland7 versus VisualStudio
Posted: Fri Mar 18, 2016 11:15 AM

JM,

Acabo de caer en la cuenta que estamos intentando acceder a una DLL de 32 bits desde una aplicaci贸n de 64 bits:

... FROM "GetBinaryTypeA" LIB "Kernel32.dll"

Y eso no se puede hacer, de ahi que se produzca el GPF.

Imagino que en 64 bits forzosamente tenemos que usar BEGINDUMP y ENDDUMP

regards, saludos

Antonio Linares
www.fivetechsoft.com
Posts: 6755
Joined: Wed Feb 15, 2012 08:25 PM
Re: Borland7 versus VisualStudio
Posted: Fri Mar 18, 2016 01:54 PM
A mi no me genera GPF, pero no devuelve el valor correcto ( 6 ), devuelve 0

Code (fw): Select all Collapse
DLL32 FUNCTION GetBinaryType( cFile AS LPSTR, @nType AS DWORD ) AS DWORD PASCAL FROM "GetBinaryTypeW" LIB "Kernel32.dll"

Function Tipo()

  local cFichero := "d:\fwh\fwhteam\samples\prucmenu.exe"
  //local cFichero := "d:\fwh\fwhteam\samples\scilex64.dll"
  local nTipo    := 0

  GetBinaryType( cFichero, @nTipo )
  MsgInfo( nTipo, "Tipo de fichero" )

return nil
Cristobal Navarro

Hay dos tipos de personas: las que te hacen perder el tiempo y las que te hacen perder la noci贸n del tiempo

El secreto de la felicidad no est谩 en hacer lo que te gusta, sino en que te guste lo que haces
Posts: 654
Joined: Mon May 29, 2006 03:14 PM
Re: Borland7 versus VisualStudio
Posted: Fri Mar 18, 2016 07:14 PM
cnavarro wrote:A mi no me genera GPF, pero no devuelve el valor correcto ( 6 ), devuelve 0

Crist贸bal,

Si inicializas la variable con un valor distinto de CERO (ejemplo nTipo:=-1) podr谩s comprobar si al pasarla por referencia se cambia el valor, probablemente ni siquiera funcione la "llamada a la funci贸n".

A mi me ha pasado a veces casos de variables que no cambian de valor y como el CERO es un valor "muy usado" en los valores devueltos por funciones pues procuro no usar el cero, a veces, para seg煤n que casos.

Antonio,

No existe una KERNEL.DLL de 64 bits o similar, al menos no la he encontrado. Los comentarios encontrados en SanGoogle apuntan a que no existe. Estoy buscando comentario al respecto, si encuentro algo te lo paso.

Al respecto he encontrado esto http://stackoverflow.com/questions/1364 ... e-kernel64
Aqu铆 comenta que (traducci贸n Google):
"En las versiones de 64 bits de Windows la kernel32.dll contiene c贸digo de 64 bits, pero todav铆a se llama kernel32.dll. Esto es al menos enga帽oso".
"Siempre llama kernel32.dll, incluso en Windows de 64 bits. Esto es por las mismas razones de compatibilidad que system32 contiene los binarios de 64 bits, mientras que syswow64 contiene binarios de 32 bits".
64-bit de Windows proporciona un entorno como "fuera de la caja" y es compatible con aplicaciones de 32 bits utilizando el 'Windows on Windows 64' subsistema, abreviado a WOW64, que se ejecuta en modo usuario y asigna la de 32 bits llama al sistema operativo n煤cleo en una llamada de 64 bits equivalente. Esto es normalmente casi invisible a los que llaman program.Windows proporciona un conjunto de DLL de 64 bits en% windir% \ system32 y un conjunto equivalente de DLL de 32 bits en% windir% \ syswow64. De hecho la mayor parte de las im谩genes binarias en este directorio son id茅nticos a los mismos archivos en el directorio System32 en una instalaci贸n de Windows de 32 bits. (Me parece una cuesti贸n de nomenclatura lamentable que las DLL de 64 bits viven en system32 y los 32 bits viven en syswow64, pero no lo es)".


Se me ocurre si ser铆a bueno que aumentaras los "#xcommand" del fichero DLL.CH adapt谩ndolo a 64 bits. En este fichero de cabecera tienes #xcommand DLL... #xcommand DLL32... si se pudiera a帽adir un #xcommand DLL64.... Tambi茅n hay funciones GetProcAdd/GetProc32, FWCallDLL/FWCallDLL32, LoadLibrary/LoadLib32 y FreeLibrary/FreeLib32 lo que denota que tuviste que adaptar el tema en su tiempo.

Gracias.

P.D.: Sea como fuere la soluci贸n esta aqu铆 (alguien que sepa ingles "t茅cnico" y lo comprenda):
Why can't 32-bit DLL's be used in a 64-bit program? Is there a way to evade this limitation?
http://www.viva64.com/en/l/0002/#ID0E5MAC
Why can't you thunk between 32-bit and 64-bit Windows?
http://blogs.msdn.com/b/oldnewthing/arc ... 06720.aspx
Accessing 32-bit DLLs from 64-bit code
http://blog.mattmags.com/2007/06/30/acc ... -bit-code/
Mi abuelo dec铆a: Los aviones vuelan porque Dios quiere, y los helic贸pteros ni Dios sabe porque vuelan.

FWH 16.02, xHarbour 1.2.3, Harbour 3.2.0, WorkShop 4.5, AJ Make 0.30, Borlan BCC 7.00, VisualStudio 2013