Página 1 de 1

Sobre Inline C

Publicado: Jue Sep 07, 2006 6:46 pm
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.

Sobre Inline C

Publicado: Vie Sep 08, 2006 1:56 am
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.

Sobre Inline C

Publicado: Vie Sep 08, 2006 8:39 am
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

Sobre Inline C

Publicado: Vie Sep 08, 2006 10:48 am
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
>
>

Sobre Inline C

Publicado: Vie Sep 08, 2006 11:07 am
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

Sobre Inline C

Publicado: Vie Sep 08, 2006 12:30 pm
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.