FiveTech Support Forums

FiveWin / Harbour / xBase community
Board index FiveWin para Harbour/xHarbour AYUDA CON API'S
Posts: 86
Joined: Sat Jun 24, 2006 04:27 PM
AYUDA CON API'S
Posted: Thu Mar 20, 2008 10:44 PM

Buen d铆a para todos...

Que tal amigos me pueden ayudar por favor a adaptar o utilizar las siguientes api's en FWH:

pragma BEGINDUMP

include <hbapi.h>

include <windows.h>

HB_FUNC( GETDRIVETYPE )
{
hb_retnl( GetDriveTypeA( hb_parc( 1 ) ) );
} // SOLO FUNCIONA ESTA :-(

HB_FUNC( GETDISKFREESPACE )
{
LPSTR lpRootPathName = hb_parc(1);
LPLONG lpSectorsPerCluster = hb_parnl(2);
LPLONG lpBytesPerSector = hb_parnl(3);
LPLONG lpNumberOfFreeClusters = hb_parnl(4);
LPLONG lpTtoalNumberOfClusters = hb_parnl(5);

hb_retnl( GetDiskFreeSpaceA( lpRootPathName, &lpSectorsPerCluster,
&lpBytesPerSector, &lpNumberOfFreeClusters,
&lpTtoalNumberOfClusters ) )
}

HB_FUNC( GETVOLUMEINFORMATION )
{
LPSTR lpRootPathName = hb_parnc(1);
LPSTR lpVolumeNameBuffer = hb_parnc(2);
LPLONG nVolumeNameSize = hb_parnl(3);
LPLONG lpVolumeSerialNumber = hb_parnl(4);
LPLONG lpMaximumComponentLength = hb_parnl(5);
LPLONG lpFileSystemFlags = hb_parnl(6);
LPSTR lpFileSystemNameBuffer = hb_parnc(7);
LPLONG nFileSystemNameSize = hb_parnl(8);

hb_retnl( GetVolumeInformationA( lpRootPathName, lpVolumeNameBuffer,
nVolumeNameSize, &lpVolumeSerialNumber,
&lpMaximumComponentLength, &lpFileSystemFlags,
&lpFileSystemNameBuffer, nFileSystemNameSize ) )
}

pragma ENDDUMP

Esto es lo poco que he podido hacer viendo ejemplos en el foro :(, a lo mejor es una tonter铆a pero de verdad no manejo para nada C, por eso solicito su gran ayuda.

Nota: Les agradecer铆a si me pueden informar si existe alguna ayuda para realizar estas conversiones de de API en C, ya que serian de gra ayuda para estos casos :lol:

Saludos,

Antonio Castro
Maracaibo - Venezuela
ant_cas@yahoo.com
Posts: 44158
Joined: Thu Oct 06, 2005 05:47 PM
AYUDA CON API'S
Posted: Thu Mar 20, 2008 11:31 PM
Antonio,

LP... significa LONG POINTER que significa "puntero" (LONG = largo, que significa 32 bits). Un "puntero" es la direcci贸n de un valor:
HB_FUNC( GETDISKFREESPACE ) 
{ 
   LPSTR lpRootPathName = hb_parc(1); 
   LONG SectorsPerCluster; 
   LONG BytesPerSector; 
   LONG NumberOfFreeClusters; 
   LONG TotalNumberOfClusters; 

   hb_retnl( GetDiskFreeSpace( lpRootPathName, &SectorsPerCluster, 
                 &BytesPerSector, &NumberOfFreeClusters, 
                 &TotalNumberOfClusters ) ) 
}

Las cadenas son siempre punteros a un grupo de bytes, por lo que no hay que modificarlos.

Y ahora falta devolver los valores que la funci贸n pone en esas variables tipo LONG. Int茅ntalo :-)
regards, saludos

Antonio Linares
www.fivetechsoft.com
Posts: 44158
Joined: Thu Oct 06, 2005 05:47 PM
AYUDA CON API'S
Posted: Thu Mar 20, 2008 11:35 PM
Mira el prototipo de la funci贸n en C:
BOOL WINAPI GetDiskFreeSpace(
  __in   LPCTSTR lpRootPathName,
  __out  LPDWORD lpSectorsPerCluster,
  __out  LPDWORD lpBytesPerSector,
  __out  LPDWORD lpNumberOfFreeClusters,
  __out  LPDWORD lpTotalNumberOfClusters
);

__in se refiere a que es valor de "entrada". Es decir, recibe ese valor.
__out se refiere a que es valor de "salida". Es decir, va a devolver un valor en esa variable.

Por cierto, que hemos declarado las variables como LONG y lo correcto es LPDWORD (puntero largo a DWORD). DWORD significa "double word" (palabra larga) refiri茅ndose que es un valor de 32 bits. Con signo, si no me equivoco.
regards, saludos

Antonio Linares
www.fivetechsoft.com
Posts: 86
Joined: Sat Jun 24, 2006 04:27 PM
AYUDA CON API'S
Posted: Fri Mar 21, 2008 04:25 AM

Buen d铆a para todos...

Que tal Antonio, despues de estar un BUEN rato tratando que hacer que funcione el c贸digo que me diste no he pordido hacer sino esto y no funciona porque no devuelve el valor en las variable por referencia:

BOOL WINAPI GetDiskFreeSpace(
IN LPCTSTR lpRootPathName,
OUT LPDWORD lpSectorsPerCluster,
OUT LPDWORD lpBytesPerSector,
OUT LPDWORD lpNumberOfFreeClusters,
OUT LPDWORD lpTotalNumberOfClusters );

Por favor me puedes ayuda a resolver este problemita, e insisto si me pueden informar por favor si existe alguna ayuda para realizar estas conversiones de API en C, as铆 no te quitar铆a m谩s tiempo en estas tonter铆as

Saludos,

Antonio Castro
Maracaibo - Venezuela
ant_cas@yahoo.com
Posts: 44158
Joined: Thu Oct 06, 2005 05:47 PM
AYUDA CON API'S
Posted: Fri Mar 21, 2008 09:17 AM

Antonio,

La 煤nica ayuda es aprender (practicando) a usar el lenguaje C y revisar el c贸digo en lenguaje C que proporciona FiveWin en los directorios source\winapi y source\function

Para completar tu funci贸n tienes que decidir como quieres devolver los valores, ya que como has visto, la funci贸n en C devuelve varios valores que deposita en variables de tipo DWORD.

Quieres devolver un array con todos esos valores 贸 prefieres pasar esos valores por referencia a la funci贸n y que la funci贸n en C los cambie ?

regards, saludos

Antonio Linares
www.fivetechsoft.com
Posts: 86
Joined: Sat Jun 24, 2006 04:27 PM
AYUDA CON API'S
Posted: Fri Mar 21, 2008 03:18 PM
Buen d铆a para todos...

Antonio Linares wrote:Antonio,
Quieres devolver un array con todos esos valores 贸 prefieres pasar esos valores por referencia a la funci贸n y que la funci贸n en C los cambie ?


Creo que lo mejor es que la misma funci贸n devuelva los valores por referencia, pero ser铆a bueno saber como se devuelven a un array, as铆 tendr铆a las 2 formas de hacerlo y me servir铆a para aprender y no molestarte de nuevo por esto. Gracias Antonio por tu ayuda
Saludos,

Antonio Castro
Maracaibo - Venezuela
ant_cas@yahoo.com
Posts: 44158
Joined: Thu Oct 06, 2005 05:47 PM
AYUDA CON API'S
Posted: Fri Mar 21, 2008 07:30 PM
Antonio,

Para devolver un array hay que a帽adir este c贸digo al final:
   hb_reta( 4 ); // creamos y devolvemos un array de 4 elementos.

   // rellenamos los datos del array (situado en "return", que se indica con -1)
   hb_stornl( SectorsPerCluster, -1, 1 );
   hb_stornl( BytesPerSector, -1, 2 );
   hb_stornl( NumberOfFreeClusters, -1, 3 );
   hb_stornl( TotalNumberOfClusters, -1, 4 );
regards, saludos

Antonio Linares
www.fivetechsoft.com
Posts: 44158
Joined: Thu Oct 06, 2005 05:47 PM
AYUDA CON API'S
Posted: Fri Mar 21, 2008 07:34 PM
Para devolver los valores por referencia hay que a帽adir este c贸digo al final (y no usar el anterior):
   hb_stornl( SectorsPerCluster, 2 ); // Almacena en el par谩metro 2
   hb_stornl( BytesPerSector, 3 );  // Almacena en el par谩metro 3
   hb_stornl( NumberOfFreeClusters, 4 ); // Almacena en el par谩metro 4 
   hb_stornl( TotalNumberOfClusters, 5 ); // Almacena en el par谩metro 5

Esos valores se tienen que pasar a la funci贸n desde el PRG con "@" delante, para indicar "por referencia".
regards, saludos

Antonio Linares
www.fivetechsoft.com
Posts: 86
Joined: Sat Jun 24, 2006 04:27 PM
AYUDA CON API'S
Posted: Sat Mar 22, 2008 04:43 PM
Buen d铆a para todos...

Antonio,

Muchas gracias por tu ayuda resolv铆 viendo unos ejemplos y la librer铆a hbapi.h, me orient茅 gracias a los comentrios que tiene cada funci贸n y vi que eran para devolver los valores por referencia :-)

hb_stornl( long lValue, int iParam, ... ); /* stores a long on a variable by reference */

hb_storc( char * szText, int iParam, ... ); /* stores a szString on a variable by reference */

Tambien hab铆a visto hb_reta( ULONG ulLen ); /* returns an array with a specific length */, pero no sab铆a como cargar los valores :-)

Tuve un peque帽o problema para hacer trabajar la funci贸n GETVOLUMEINFORMATION, poque con este c贸digo no funciona

HB_FUNC( GETVOLUMEINFORMATION )
{
   LPSTR lpRootPathName = hb_parc( 1 );
   LPSTR lpVolumeNameBuffer;
   DWORD nVolumeNameSize;
   DWORD lpVolumeSerialNumber;
   DWORD lpMaximumComponentLength;
   DWORD lpFileSystemFlags;
   LPSTR FlpFileSystemNameBuffer;
   DWORD nFileSystemNameSize;

   hb_retnl( GetVolumeInformation( lpRootPathName, lpVolumeNameBuffer,
                                   lpVolumeNameBuffer, &lpVolumeSerialNumber,
                                   lpMaximumComponentLength, lpFileSystemFlags,
                                   lpFileSystemNameBuffer, lpFileSystemNameBuffer ) );

   hb_storc(  lpVolumeNameBuffer,     2 );
   hb_storc(  lpFileSystemNameBuffer, 7 );
   hb_stornl( lpVolumeSerialNumber,   4 );
} // ASI NO FUNCIONA


Pero me fij茅 en el c贸digo de harddisk.c y lo adapt茅 a mis necesidades y funcion贸 perfecto

HB_FUNC( GETVOLUMEINFORMATION )
{
   LPSTR lpRootPathName = hb_parc( 1 );
   BYTE  lpVolumeNameBuffer[ 256 ];
   DWORD lpVolumeSerialNumber;
   BYTE  lpFileSystemNameBuffer[ 256 ];

   hb_retnl( GetVolumeInformation( lpRootPathName, lpVolumeNameBuffer,
                                   lpVolumeNameBuffer, &lpVolumeSerialNumber,
                                   lpMaximumComponentLength, lpFileSystemFlags,
                                   lpFileSystemNameBuffer, lpFileSystemNameBuffer ) );

   hb_storc(  lpVolumeNameBuffer,     2 );
   hb_storc(  lpFileSystemNameBuffer, 7 );
   hb_stornl( lpVolumeSerialNumber,   4 );
} // ESTE ASI FUNCIONA


pero tengo la duda de porque no funciona de la primera forma si est谩 igual como lo dice el API??? :-)
Saludos,

Antonio Castro
Maracaibo - Venezuela
ant_cas@yahoo.com
Posts: 44158
Joined: Thu Oct 06, 2005 05:47 PM
AYUDA CON API'S
Posted: Sun Mar 23, 2008 01:29 PM

Antonio,

Tienes que comprender mejor el tema de los punteros en C. Entender los punteros en C es obtener el "aprobado" en lenguaje C :-)

El lenguaje C no permite errores, pero eso es lo bueno de 茅l, que hace exactamente lo que se le dice. Porque si se le dice algo mal, 茅l no lo arregla por nosotros :-)

Si te fijas en la documentaci贸n de la funci贸n del API, dice esto:

lpVolumeNameBuffer
Points to a buffer that receives the name of the specified volume.

Es decir, ha de apuntar a un buffer que va a recibir el nombre. Luego has de crear un buffer, por eso cuando lo declaras como BYTE lpVolumeNameBuffer[ 256 ]; entonces si est谩s creando un buffer, y el nombre de ese buffer es su direcci贸n (es su "puntero").

Si lo declaras como LPSTR lo que declaras es una direcci贸n, pero una direcci贸n a donde ?? a ning煤n sitio, lo que resultar谩 en un GPF seguramente :-)

regards, saludos

Antonio Linares
www.fivetechsoft.com
Posts: 86
Joined: Sat Jun 24, 2006 04:27 PM
AYUDA CON API'S
Posted: Sun Mar 23, 2008 09:02 PM

Buen d铆a para todos...

Antonio,

Muy agradecido por tu tiempo, paciencia y por las explicaciones tan claras, se ve a leguas que eres un barbaro en C :shock:

Por lo pronto me baj茅 unos manuales de apuntadores en C para conocer algo al respecto :roll:, y gracias a tu ayuda pude hacerle unas mejoras a la clase TDiskInfo, las cuales voy a colocar por aca para ver si le sirve de algo a los compa帽eros del foro.

Saludos,

Antonio Castro
Maracaibo - Venezuela
ant_cas@yahoo.com

Continue the discussion