Page 1 of 3

Borland7 versus VisualStudio

PostPosted: Fri Mar 11, 2016 10:11 pm
by JmGarcia
Estoy empezando a querer compilar en 64 bits y me surgen "grandes dudas", a saber:

¿Compila Borland7 en 64 bits? pregunta del millón.
Si la respuesta anterior es afirmativa ¿Que compilador uso: Borland7 o VisualStudio?
¿Hay que usar Harbour o xHarbour?

A primera vista no se me ocurren mas, pero seguro que tendré muchas mas.

Gracias por las respuestas.

Re: Borland7 versus VisualStudio

PostPosted: Sat Mar 12, 2016 7:09 am
by Antonio Linares
JM,

> ¿Compila Borland7 en 64 bits? pregunta del millón.

Si, pero de momento no lo soportamos. Estamos investigándolo.

> Si la respuesta anterior es afirmativa ¿Que compilador uso: Borland7 o VisualStudio?

Visual Studio

> ¿Hay que usar Harbour o xHarbour?

Harbour

Re: Borland7 versus VisualStudio

PostPosted: Sat Mar 12, 2016 10:45 am
by JmGarcia
Aclarado.

Por el foro he encontrado una respuesta tuya que decía que el Visual Studio 2013 Express es la versión 12.0 (que aparece en los build.bat).

Entonces me he encontrado el la web http://www.visualstudio.com estas versiones:
Community 2013
Ultimate 2013
Premium 2013
Professional 2013
Test Professional 2013
Express 2013 para escritorio
Express 2013 para Web
Express 2013 para Windows

Visual Studio 2013 Update 5


¿De las versiones Express cual me descargo?
¿Es gratis la versión "Express"?

Gracias.

Re: Borland7 versus VisualStudio

PostPosted: Sat Mar 12, 2016 11:06 pm
by Antonio Linares
JM,

Descarga esta versión:

Express 2013 para escritorio

Es gratuita

Re: Borland7 versus VisualStudio

PostPosted: Sat Mar 12, 2016 11:42 pm
by JmGarcia
Y ya por último una preguntas mas:

Una vez instalado el "Express 2013 para escritorio" ¿sería posible sacar una árbol de directorios "transportable/portable" a otros PCs?, algo así como el BCC (bin, include, lib, etc...) y no tener que reinstalar cada vez.

No se si me he explicado.

Re: Borland7 versus VisualStudio

PostPosted: Sun Mar 13, 2016 7:21 am
by Antonio Linares
JM,

Eso se podría hacer, de hecho lo haciamos al principio de usar Visual Studio,
pero actualmente mi recomendación es no hacerlo y reinstalar en cada PC.

Es preferible usar la estructura de ficheros y carpetas que el propio Visual Studio crea.

Re: Borland7 versus VisualStudio

PostPosted: Sun Mar 13, 2016 8:27 pm
by JmGarcia
OK.

El build64.bat veo que ya tiene los path apuntando a la instalación que hace Visual Studio.
Code: Select all  Expand view
if exist "%ProgramFiles%\Microsoft Visual Studio 12.0\VC\vcvarsall.bat" call "%ProgramFiles%\Microsoft Visual Studio 12.0\VC\vcvarsall.bat" x86_amd64
if exist "%ProgramFiles(x86)%\Microsoft Visual Studio 12.0\VC\vcvarsall.bat" call "%ProgramFiles(x86)%\Microsoft Visual Studio 12.0\VC\vcvarsall.bat" x86_amd64

Bueno pues listos para la nueva andadura.

Gracias.

Re: Borland7 versus VisualStudio

PostPosted: Tue Mar 15, 2016 10:28 am
by JmGarcia
Sea como fuere he cogido el directorio VC del Visual Studio y lo he llevado a otro lugar fuera de ProgramFiles y modificando los build.bat apuntando al nuevo path funciona y compila bien.

Solo me queda "desinstalar" el Visual Studio y comprobar que si funciona, son unos 600Mb.

Por cierto: ¿hay forma de saber si un ejecutable es de 32 o 64 bits sin necesidad de ejecutarlo?

Re: Borland7 versus VisualStudio

PostPosted: Tue Mar 15, 2016 11:04 am
by Antonio Linares
JM,

A ver si te funciona bien, ya nos contarás.

Las cabeceras de los EXEs son diferentes en 32 y 64 bits.

En 64 bits está esta cadena: "This program cannot be run in DOS mode"

En 32 bits aparece esta: "This program must be run under Win32"

Re: Borland7 versus VisualStudio

PostPosted: Tue Mar 15, 2016 2:48 pm
by JmGarcia
Antonio Linares wrote:En 64 bits está esta cadena: "This program cannot be run in DOS mode"
Este mensaje, visto con un editor hexadecimal, me sale en un programa de 32 bits y en otro de 64 bits compilados con Visual Studio.


Antonio Linares wrote:En 32 bits aparece esta: "This program must be run under Win32"
Este mensaje NO me sale en programas de 32 bits ni de 64 bits compilados con Visual Studio. Sin embargo compilado con BCC7, el de 32 bits, si sale este mensaje.


¿El sistema operativo no tiene forma de saberlo con el menú contextual, administrador de procesos...? o alguna herramienta propia del sistema operativo.

Re: Borland7 versus VisualStudio

PostPosted: Tue Mar 15, 2016 5:54 pm
by Antonio Linares
JM,

Tienes toda la razón, esa cadena es propia del compilador.

Podemos usar esta función de Windows:
https://msdn.microsoft.com/en-us/library/aa364819(VS.85).aspx

Re: Borland7 versus VisualStudio

PostPosted: Wed Mar 16, 2016 12:34 pm
by JmGarcia
Tratando de "wrapear" la función GetBinaryType me encuentro con el problema de no poder definir "un puntero a long o dword" para pasar una variable por referencia. Para strings existe y es la constante LPSTR.

Mirando los ficheros DLL.CH he encontrado las constantes para ello:
Code: Select all  Expand view
#ifndef _C_TYPES
   #define _C_TYPES
   #define VOID      0
   #define BYTE      1
   #define CHAR      2
   #define WORD      3
#ifdef __CLIPPER__
   #define _INT      4 // conflicts with Clipper Int()
#else
   #define _INT      7
#endif
   #define BOOL      5
   #define HDC       6
   #define LONG      7
   #define STRING    8
   #define LPSTR     9
   #define PTR      10
   #define _DOUBLE  11 // conflicts with BORDER DOUBLE
   #define DWORD    12
   #define LONGLONG 13
#endif
Pero no existe ninguna constante de "puntero a long o dword".

En los "Windows Data Types" https://msdn.microsoft.com/en-us/librar ... 51(v=vs.85).aspx están todos los tipos de variables, pero no me pone su valor de constante. Supongo que será la constante LPLONG o LPDWORD.
La constante LPSTR la define así: A pointer to a null-terminated string of 8-bit Windows (ANSI) characters. For more information, see Character Sets Used By Fonts.
Pero la función dice que tiene que ser LPCTSTR definida como: An LPCWSTR if UNICODE is defined, an LPCSTR otherwise. For more information, see Windows Data Types for Strings.
En el ficheros DLL.CH tampoco tengo el valor de la constante LPCTSTR.

La definición de la función es esta:
Code: Select all  Expand view
BOOL WINAPI GetBinaryType(
  _In_  LPCTSTR lpApplicationName,
  _Out_ LPDWORD lpBinaryType
);
https://msdn.microsoft.com/en-us/library/aa364819(VS.85).aspx

El wrapeado es:
DLL32 FUNCTION GetBinaryType(cFile AS <no se que poner>, nType AS <no se que poner>) AS LONG PASCAL FROM "GetBinaryTypeW" LIB "Kernel32.dll"
 Por otro lado la dll Kernel32.dll dispone de dos funciones GetBinaryType: GetBinaryTypeA (ANSI) y GetBinaryTypeW (Unicode), y no se cual usar.

¿Se podrían tener todos los valores de los tipos de variables?

Re: Borland7 versus VisualStudio

PostPosted: Wed Mar 16, 2016 4:27 pm
by Antonio Linares
Prueba asi:

DLL32 FUNCTION GetBinaryType(cFile AS LPSTR, nType AS PTR ) AS LONG PASCAL FROM "GetBinaryTypeA" LIB "Kernel32.dll"

y pasa el valor nType por referencia a la función:

@nType

Re: Borland7 versus VisualStudio

PostPosted: Wed Mar 16, 2016 6:17 pm
by JmGarcia
Antonio Linares wrote:DLL32 FUNCTION GetBinaryType(cFile AS LPSTR, nType AS PTR ) AS LONG PASCAL FROM "GetBinaryTypeA" LIB "Kernel32.dll"
Usando la función GetBinaryTypeA me da el error de "Programa.exe dejo de funcionar...". Usando GetBinaryTypeW funciona el ejecutable pero no hace nada, no me devuelve la variable nType "modificada".
En ambos casos se compila bien. Pasa lo mismo compilado con BCC7 y con VS12.

El código fuente:
Code: Select all  Expand view
#include "FiveWin.Ch"
FUNCTION main()
public cFichero:="Programa.exe",nTipo:=-1
GetBinaryType(cFichero,@nTipo)
MsgInfo(nTipo,"Tipo de fichero")
return nil
DLL32 FUNCTION GetBinaryType(cFile AS LPSTR, nType AS PTR) AS LONG PASCAL FROM "GetBinaryTypeA" LIB "Kernel32.dll"

Probablemente la única solución sea usando código C puro (#pragma BEGINDUMP .../... #pragma ENDDUMP)

Re: Borland7 versus VisualStudio

PostPosted: Wed Mar 16, 2016 8:33 pm
by Antonio Linares
JM,

Prueba a quitar la claúsula PASCAL:

DLL32 FUNCTION GetBinaryType(cFile AS LPSTR, nType AS PTR) AS LONG FROM "GetBinaryTypeA" LIB "Kernel32.dll"

y usa GetBinaryTypeA