In order for this site to work correctly we need to store a small file (called a cookie) on your computer. Most every site in the world does this, however since the 25th of May 2011, by law we have to get your permission first. Please abandon the forum if you disagree.

Para que este foro funcione correctamente es necesario guardar un pequeño fichero (llamado cookie) en su ordenador. La mayoría de los sitios de Internet lo hacen, no obstante desde el 25 de Marzo de 2011 y por ley, necesitamos de su permiso con antelación. Abandone este foro si no está conforme.

Sobre Inline C

Foro público de Xailer en español
Responder
Bingen Ugaldebere
Mensajes: 1310
Registrado: Mié Sep 26, 2007 7:12 pm

Sobre Inline C

Mensaje por Bingen Ugaldebere »

Ya he mirado en el manual de xHb todo lo referente a
hb_parXX()
hb_retXX()
hb_storXX()
pero no encuentro referencia alguna a los tipos de variables a utilizar
Dword, Int, char, etc., es decir, que es un
"const signed char" "unsigned long"
Alguna idea de donde puedo verlo???
Salu2 y gracias.
Manu
Mensajes: 108
Registrado: Dom Sep 24, 2006 2:28 pm

Sobre Inline C

Mensaje por Manu »

Bingen mí­rate el fichero de includes de xHarbour llamado clipdefs.h ;-)
Bingen Ugaldebere escribió:
> Ya he mirado en el manual de xHb todo lo referente a
> hb_parXX()
> hb_retXX()
> hb_storXX()
>
> pero no encuentro referencia alguna a los tipos de variables a utilizar
> Dword, Int, char, etc., es decir, que es un
> "const signed char" "unsigned long"
>
> Alguna idea de donde puedo verlo???
>
> Salu2 y gracias.
Bingen Ugaldebere
Mensajes: 1310
Registrado: Mié Sep 26, 2007 7:12 pm

Sobre Inline C

Mensaje por Bingen Ugaldebere »

Gracias, ya lo estoy mirando.
No habrá una explicación mas extendida de cada tipo de dato que alguien
me pueda proporcionar??
Estoy haciendo un Inline C como este y me da un error de tipos y no se
cual es el que debo de aplicar.
Type mismatch in parameter 'szText' (wanted 'const signed char *', got
'unsigned long')
#pragma BEGINDUMP
#include <windows.h>
#include <xailer.h>
XA_FUNC( GETLOGICALDRIVES )
{
SHORT nBufferLength = 255;
CHAR cString[255] ;
hb_retc( GetLogicalDriveStrings( nBufferLength , cString) );
}
#pragma ENDDUMP
Manu
Mensajes: 108
Registrado: Dom Sep 24, 2006 2:28 pm

Sobre Inline C

Mensaje por Manu »

Prueba a poner esta linea después del último include de C:
#define _CLIPDEFS_H // Para evitar las redefiniciones en windows
Bingen Ugaldebere escribió:
> Gracias, ya lo estoy mirando.
>
> No habrá una explicación mas extendida de cada tipo de dato que alguien
> me pueda proporcionar??
>
> Estoy haciendo un Inline C como este y me da un error de tipos y no se
> cual es el que debo de aplicar.
>
> Type mismatch in parameter 'szText' (wanted 'const signed char *', got
> 'unsigned long')
>
>
>
> #pragma BEGINDUMP
> #include <windows.h>
> #include <xailer.h>
>
> XA_FUNC( GETLOGICALDRIVES )
> {
> SHORT nBufferLength = 255;
> CHAR cString[255] ;
>
> hb_retc( GetLogicalDriveStrings( nBufferLength , cString) );
> }
>
> #pragma ENDDUMP
>
>
Avatar de Usuario
jfgimenez
Site Admin
Mensajes: 5718
Registrado: Lun Abr 06, 2015 8:48 pm
Contactar:

Sobre Inline C

Mensaje por jfgimenez »

Bingen,
> No habrá una explicación mas extendida de cada tipo de dato que alguien me
> pueda proporcionar??
Puedes usar, en principio, todos los tipos de datos de C, que se escriben
siempre en minúsculas. Por otro lado, C permite declarar tipos nuevos, de
ahí la gran cantidad de tipos adicionales, que se suelen escribir en
mayúsculas para no confundirlos con los tipos nativos de C. Ten en cuenta
que C es 'case sensitive'.
Pues bien, windows aporta un montón de tipos nuevos, que son los que vas a
encontrar en todos los prototipos de funciones del API. Por otro lado,
[x]Harbour también aporta otros tipos. En cualquier caso, la mayoría de esos
tipos son intercambiables entre sí, y el compilador ni siquiera te da un
warning por ser tipos compatibles. P.ej (en 32 bits, que es lo que nos atañe
actualmente):
unsigned char = UCHAR = BYTE -> número entero de 8 bits sin signo
short = SHORT = INT16 -> número entero de 16 bits con signo
unsigned short = WORD -> número entero de 16 bits sin signo
int = long = INT = INT32 -> número entero de 32 bits con signo
unsigned int = DWORD = ULONG -> número entero de 32 bits sin signo
char [] ~ char * = LPSTR ~ LPCSTR -> string o array de caracteres
> Estoy haciendo un Inline C como este y me da un error de tipos y no se
> cual es el que debo de aplicar.
>
> Type mismatch in parameter 'szText' (wanted 'const signed char *', got
> 'unsigned long')
Este mensaje de error lo que dice es que el parámetro szText tiene que ser
del tipo 'const char *' (o LPCSTR) y en realidad le estás pasando un
'unsigned long' (o ULONG, o DWORD).
Traduciendo... que la función hb_retc() necesita como parámetro una cadena,
pero la función GetLogicalDriveStrings() te devuelve un número.
> #pragma BEGINDUMP
> #include <windows.h>
> #include <xailer.h>
>
> XA_FUNC( GETLOGICALDRIVES )
> {
> SHORT nBufferLength = 255;
> CHAR cString[255] ;
>
> hb_retc( GetLogicalDriveStrings( nBufferLength , cString) );
> }
>
> #pragma ENDDUMP
Lo correcto sería:
XA_FUNC( GETLOGICALDRIVES )
{
DWORD nBufferLength = 255;
char cString[255] ;
if( GetLogicalDriveStrings( nBufferLength , cString) == 0 )
hb_retc( "" );
else
hb_retc( cString );
}
--
Un saludo,
José F. Giménez
http://www.xailer.com
José F. Giménez
[Equipo de Xailer / Xailer team]
http://www.xailer.com
http://www.xailer.info
Bingen Ugaldebere
Mensajes: 1310
Registrado: Mié Sep 26, 2007 7:12 pm

Sobre Inline C

Mensaje por Bingen Ugaldebere »

Muchas gracias por tus explicaciones como siempre muy didácticas, al
final la función no retorna lo que creo que debiera pero como ejemplo me
va sirviendo.
Salu2.
Responder