GetAdaptersInfo ¿DLL32 FUNCION o BEGINDUMP/ENDDUMP?

GetAdaptersInfo ¿DLL32 FUNCION o BEGINDUMP/ENDDUMP?

Postby JmGarcia » Mon Mar 21, 2016 7:46 pm

Pues en mi lucha con las DLL32 FUNCTION y los BEGINDUMP/ENDDUMP cada vez lo tengo menos claro.

Llevo tiempo persiguiendo desarrollar al completo la función GetAdaptersInfo y con DLL32 me da como resultado nil y con #PRAGMA me da 0 pero no me funciona en ambos casos.

Código con DLL32:
Code: Select all  Expand view
DLL32 FUNCTION GetAdaptersInfo( lpAdapterInfo AS LPSTR, BufLen AS LONG ) AS LONG PASCAL FROM "GetAdaptersInfoA" LIB "IPHlpApi.dll"


Código en C con #pragma:
Code: Select all  Expand view
#pragma BEGINDUMP
#include <windows.h>
#include <Iphlpapi.h>
HB_FUNC( GETADAPTERSINFO )
{
   LPCTSTR lpAdapterInfo = ( LPCTSTR ) hb_parc( 1 ) ;
   LPDWORD dwBufLen = ( LPDWORD ) hb_parni( 2 ) ;
   DWORD dwError = 0 ;
   dwError = GetAdaptersInfo(&lpAdapterInfo,&dwBufLen) ;
   hb_retni( dwError ) ;
}
#pragma ENDDUMP


La definición del MSDN es esta: https://msdn.microsoft.com/en-us/librar ... 17(v=vs.85).aspx

Además también estoy con la pelea de definir las estructuras de datos:
Code: Select all  Expand view
STRUCT IP_ADDR_STRING
  MEMBER Next      As LONG
  MEMBER IpAddress As STRING LEN 16
  MEMBER IpMask    As STRING LEN 16
  MEMBER Context   As LONG
ENDSTRUCT

STRUCT IP_ADAPTER_INFO
  MEMBER Next                AS LONG
  MEMBER ComboIndex          AS LONG
  MEMBER AdapterName         AS STRING LEN MAX_ADAPTER_NAME_LENGTH
  MEMBER Description         AS STRING LEN MAX_ADAPTER_DESCRIPTION_LENGTH
  MEMBER AddressLength       AS LONG
  MEMBER Address             AS STRING LEN MAX_ADAPTER_ADDRESS_LENGTH // -1 // (MAX_ADAPTER_ADDRESS_LENGTH - 1) AS Byte
  MEMBER Index               AS LONG
  MEMBER Type                AS LONG
  MEMBER DhcpEnabled         AS LONG
  MEMBER CurrentIpAddress    AS LONG
  MEMBER IpAddressList       AS STRING LEN IP_ADDR_STRING:SizeOf() // IP_ADDR_STRING
  MEMBER GatewayList         AS STRING LEN IP_ADDR_STRING:SizeOf() // IP_ADDR_STRING
  MEMBER DhcpServer          AS STRING LEN IP_ADDR_STRING:SizeOf() // IP_ADDR_STRING
  MEMBER HaveWins            AS LONG // BYTE // Boolean
  MEMBER PrimaryWinsServer   AS STRING LEN IP_ADDR_STRING:SizeOf() // IP_ADDR_STRING
  MEMBER SecondaryWinsServer AS STRING LEN IP_ADDR_STRING:SizeOf() // IP_ADDR_STRING
  MEMBER LeaseObtained       AS LONG
  MEMBER LeaseExpires        AS LONG
ENDSTRUCT

STRUCT FIXED_INFO
  MEMBER HostName         AS STRING LEN MAX_HOSTNAME_LEN
  MEMBER DomainName       AS STRING LEN MAX_DOMAIN_NAME_LEN
  MEMBER CurrentDnsServer AS LONG
  MEMBER DnsServerList    AS STRING LEN IP_ADDR_STRING:SizeOf() // IP_ADDR_STRING
  MEMBER NodeType         AS LONG
  MEMBER ScopeId          AS STRING LEN MAX_SCOPE_ID_LEN
  MEMBER EnableRouting    AS LONG
  MEMBER EnableProxy      AS LONG
  MEMBER EnableDns        AS LONG
ENDSTRUCT


Las estructuras según el MSDN son:
IP_ADDR_STRING https://msdn.microsoft.com/en-us/librar ... 68(v=vs.85).aspx
IP_ADAPTER_INFO https://msdn.microsoft.com/es-es/librar ... 62(v=vs.85).aspx
FIXED_INFO https://msdn.microsoft.com/en-us/librar ... 00(v=vs.85).aspx

En fin... ¿alguna ayuda?
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
User avatar
JmGarcia
 
Posts: 654
Joined: Mon May 29, 2006 3:14 pm
Location: Madrid - ESPAÑA

Re: GetAdaptersInfo ¿DLL32 FUNCION o BEGINDUMP/ENDDUMP?

Postby Antonio Linares » Mon Mar 21, 2016 9:01 pm

JM,

Te envío un email con unos ejemplos
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
 
Posts: 41314
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Re: GetAdaptersInfo ¿DLL32 FUNCION o BEGINDUMP/ENDDUMP?

Postby JmGarcia » Tue Mar 22, 2016 9:12 pm

Gracias Antonio.

¿Cómo retorno una estructura de datos de la cual solo tengo el puntero a ella?
Quisiera retornarlo como string
function main()
STRUCT MiEstrucuraHarbour
MEMBER ...
ENDSTRUCT

public cTexto:=GetAdaptersInfo()
MiEstrucuraHarbour:Buffer:=cTexto // Aquí cargaría mi estructura diseñada en FWH/(x)Harbour
return

#pragma BEGINDUMP
HB_FUNC( GETADAPTERSINFO )
{
PIP_ADAPTER_INFO pAdapterInfo = NULL;
DWORD dwBufLen = sizeof (IP_ADAPTER_INFO) ;
DWORD dwError = GetAdaptersInfo(pAdapterInfo,&dwBufLen);
FREE(pAdapterInfo);
pAdapterInfo = (IP_ADAPTER_INFO *) MALLOC(dwBufLen);
dwError = GetAdaptersInfo(pAdapterInfo,&dwBufLen);
hb_retxxx ( ¿? ); // El puntero a la estructura es "pAdapterInfo"
}
#pragma ENDDUMP
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
User avatar
JmGarcia
 
Posts: 654
Joined: Mon May 29, 2006 3:14 pm
Location: Madrid - ESPAÑA

Re: GetAdaptersInfo ¿DLL32 FUNCION o BEGINDUMP/ENDDUMP?

Postby Antonio Linares » Tue Mar 22, 2016 9:36 pm

JM,

Sería mas sencillo que devolvieses un array.

Si quieres devolver una cadena entonces tienes que usar hb_retclen( ( char * ) pAdapterInfo, sizeof (IP_ADAPTER_INFO) );
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
 
Posts: 41314
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Re: GetAdaptersInfo ¿DLL32 FUNCION o BEGINDUMP/ENDDUMP?

Postby JmGarcia » Tue Mar 22, 2016 11:35 pm

Ya voy viendo la luz al final del túnel.

He hecho la llamada a la función GetAdaptersInfo, sin enviar parámetros, y devuelve la estructura de IP_ADAPTER_INFO en formato texto para cargar el buffer de la estructura IP_ADAPTER_INFO desarrollada en FWH/(x)Harbour.

La parte de código FWH/(x)Harbour:
Code: Select all  Expand view
STRUCT IP_ADAPTER_INFO
   MEMBER Next                AS LONG
   MEMBER ComboIndex          AS LONG
   MEMBER AdapterName         AS STRING LEN MAX_ADAPTER_NAME_LENGTH + 4
   MEMBER Description         AS STRING LEN MAX_ADAPTER_DESCRIPTION_LENGTH + 4
   .../...
   MEMBER IpAddressList       AS STRING LEN IP_ADDR_STRING:SizeOf() // IP_ADDR_STRING
   .../...
ENDSTRUCT
cTexto:=GetAdaptersInfo()
IP_ADAPTER_INFO:cBuffer:=cTexto
Y tendremos los datos como estos:
IP_ADAPTER_INFO:Description
IP_ADAPTER_INFO:AdapterName
IP_ADAPTER_INFO:IpAddressList
etc...

El códifo #pragma:
Code: Select all  Expand view
HB_FUNC( GETADAPTERSINFO )
{
   PIP_ADAPTER_INFO pAdapterInfo = NULL;
   IP_ADAPTER_INFO AdapterInfo;
   DWORD dwBufLen = sizeof( AdapterInfo ); // sizeof (IP_ADAPTER_INFO) ;
   DWORD dwError = GetAdaptersInfo(pAdapterInfo,&dwBufLen);
   FREE(pAdapterInfo);
   pAdapterInfo = (IP_ADAPTER_INFO *) MALLOC(dwBufLen);
   dwError = GetAdaptersInfo(pAdapterInfo,&dwBufLen);
   hb_retclen( ( char * ) pAdapterInfo, sizeof (IP_ADAPTER_INFO) );
}

Seguimos...
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
User avatar
JmGarcia
 
Posts: 654
Joined: Mon May 29, 2006 3:14 pm
Location: Madrid - ESPAÑA

Re: GetAdaptersInfo ¿DLL32 FUNCION o BEGINDUMP/ENDDUMP?

Postby JmGarcia » Wed Mar 23, 2016 8:07 pm

Estoy tratando de anidar estructuras pero no recuerdo como lo hice alguna vez. No me funciona ninguna.

¿Podéis decirme como se anidad?

Code: Select all  Expand view
STRUCT FIXED_INFO
   MEMBER HostName         AS STRING LEN MAX_HOSTNAME_LEN + 4
   MEMBER DomainName       AS STRING LEN MAX_DOMAIN_NAME_LEN + 4
   MEMBER CurrentDnsServer AS LONG
   // *--- ¿Es así?
   STRUCT Pepe
      MEMBER Ip1 AS STRING LEN 16
   ENDSTRUCT

   MEMBER DnsServerList    AS STRING LEN IP_ADDR_STRING:SizeOf() // IP_ADDR_STRING
   MEMBER NodeType         AS LONG
   MEMBER ScopeId          AS STRING LEN MAX_SCOPE_ID_LEN + 4
   // *--- ¿O así?
   MEMBER STRUCT Pepe
      MEMBER Ip2 AS STRING LEN 16
   ENDMEMBER

   MEMBER EnableRouting    AS LONG
   MEMBER EnableProxy      AS LONG
   // *--- ¿O así?
   MEMBERSTRUCT Pepe
      MEMBER Ip3 AS STRING LEN 16
   ENDME MBER STRUCT[/color]

   MEMBER EnableDns        AS LONG
ENDSTRUCT
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
User avatar
JmGarcia
 
Posts: 654
Joined: Mon May 29, 2006 3:14 pm
Location: Madrid - ESPAÑA

Re: GetAdaptersInfo ¿DLL32 FUNCION o BEGINDUMP/ENDDUMP?

Postby Antonio Linares » Wed Mar 23, 2016 8:22 pm

JM,

Que yo recuerde, las estructuras no se pueden anidar

Tendrias que usar un MEMBER cadena y luego asignarla al cBuffer de otra estructura
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
 
Posts: 41314
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Re: GetAdaptersInfo ¿DLL32 FUNCION o BEGINDUMP/ENDDUMP?

Postby JmGarcia » Wed Mar 23, 2016 8:32 pm

Antonio Linares wrote:Tendrias que usar un MEMBER cadena y luego asignarla al cBuffer de otra estructura
Sí, es lo que hago y funciona bien.
Pero es un poco lioso y no queda "claro" el código.

Para sacar la IP hago algo asi:
Code: Select all  Expand view
STRUCT IP_ADDR_STRING
   MEMBER Next      AS LONG
   MEMBER IpAddress AS STRING LEN 16
   MEMBER IpMask    AS STRING LEN 16
   MEMBER Context   AS LONG
ENDSTRUCT
STRUCT IP_ADAPTER_INFO
   .../...
   MEMBER CurrentIpAddress    AS LONG
   MEMBER IpAddressList       AS STRING LEN IP_ADDR_STRING:SizeOf() // IP_ADDR_STRING
   ´´´/´´´
ENDSTRUCT
.../...
IP_ADDR_STRING:cBuffer:=IP_ADAPTER_INFO:IpAddressList // Copia el buffer
MsgInfo(IP_ADDR_STRING:IpAddress) // Llamo a la variable de la estructura que podría ser anidada

Pero quedaría mas limpio así: IP_ADAPTER_INFO:IpAddressList:IpAddress
Si la estructura anidada fuera algo así:
Code: Select all  Expand view
STRUCT IP_ADAPTER_INFO
   .../...
   MEMBER CurrentIpAddress    AS LONG
   MEMBER IpAddressList       AS STRUCT // o MEMBER STRUCT o similar
      MEMBER Next      AS LONG
      MEMBER IpAddress AS STRING LEN 16
      MEMBER IpMask    AS STRING LEN 16
      MEMBER Context   AS LONG
   ENDSTRUCT
   ´´´/´´´
ENDSTRUCT
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
User avatar
JmGarcia
 
Posts: 654
Joined: Mon May 29, 2006 3:14 pm
Location: Madrid - ESPAÑA

Re: GetAdaptersInfo ¿DLL32 FUNCION o BEGINDUMP/ENDDUMP?

Postby Antonio Linares » Wed Mar 23, 2016 8:36 pm

Habria que modificar el preprocesado en struct.ch y la clase TStruct, manteniendo compatibilidad con lo existente
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
 
Posts: 41314
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Re: GetAdaptersInfo ¿DLL32 FUNCION o BEGINDUMP/ENDDUMP?

Postby JmGarcia » Wed Mar 23, 2016 9:45 pm

Antonio Linares wrote:Habria que modificar el preprocesado en struct.ch y la clase TStruct, manteniendo compatibilidad con lo existente
¡¡¡ Sería maravilloso !!! :D

¿Algo así?:
Code: Select all  Expand view
STRUCT IP_ADDR_STRING
   MEMBER Next      AS LONG // 8bytes en 64bits
   MEMBER IpAddress AS STRING LEN 16
   MEMBER IpMask    AS STRING LEN 16
   MEMBER Context   AS LONG // 8bytes en 64bits
ENDSTRUCT
STRUCT IP_ADAPTER_INFO
   .../...
   MEMBER DhcpEnabled         AS LONG
   MEMBER CurrentIpAddress    AS LONG

   // Un método:
   MEMBER IpAddressList AS STRUCT IP_ADDR_STRING // Esta forma se asemeja mas a C

   // Otro método:
   STRUCT GatewayList
      MEMBER Next      AS LONG
      MEMBER IpAddress AS STRING LEN 16
      MEMBER IpMask    AS STRING LEN 16
      MEMBER Context   AS LONG
   ENDSTRUCT

   // Otro más:
   MEMBERSTRUCT GatewayList
      MEMBER Next      AS LONG
      MEMBER IpAddress AS STRING LEN 16
      MEMBER IpMask    AS STRING LEN 16
      MEMBER Context   AS LONG
   ENDMEMBERSTRUCT

   .../...
   MEMBER LeaseExpires        AS LONG
ENDSTRUCT
Me presento voluntario de betatester :roll:

He echo un "apaño" (y funciona, claro) que puede valer aunque aumenta un poco las líneas del código de la structura pero después aclara el desarrollo del código del programa propiamente dicho.
Code: Select all  Expand view
STRUCT IP_ADDR_STRING
   MEMBER Next      AS LONG
   MEMBER IpAddress AS STRING LEN 16
   MEMBER IpMask    AS STRING LEN 16
   MEMBER Context   AS LONG
ENDSTRUCT
STRUCT IP_ADAPTER_INFO
   .../...
   MEMBER IpAddressList AS STRING LEN IP_ADDR_STRING:SizeOf() // Método de cBuffer

   // MEMBER GatewayList AS STRING LEN IP_ADDR_STRING:SizeOf() // Método de cBuffer

   // Replicar la estructura de IP_ADDR_STRING con nombres de variables "adaptados"
   MEMBER GatewayList_Next      AS LONG
   MEMBER GatewayList_IpAddress AS STRING LEN 16
   MEMBER GatewayList_IpMask    AS STRING LEN 16
   MEMBER GatewayList_Context   AS LONG
   // Fin replicación

   MEMBER DhcpServer          AS STRING LEN IP_ADDR_STRING:SizeOf() // IP_ADDR_STRING
   .../...
ENDSTRUCT
.../...
MsgInfo(IP_ADAPTER_INFO:GatewayList_IpAddress)

Y ya para rematar que tipo de variable númerica es de 8 bytes. En 64bits algunos tipos variables númericas de estructuras son de 8 bytes y en 32bits, las mismas, son de 4 bytes.
En FWH/(x)Harbour ¿que variable númerica es de 8 bytes? o como apañarlo.
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
User avatar
JmGarcia
 
Posts: 654
Joined: Mon May 29, 2006 3:14 pm
Location: Madrid - ESPAÑA

Re: GetAdaptersInfo ¿DLL32 FUNCION o BEGINDUMP/ENDDUMP?

Postby Antonio Linares » Thu Mar 24, 2016 6:57 am

JM,

> que tipo de variable númerica es de 8 bytes

Basicamente es un puntero de 64 bits ( 8 x 8 = 64 )

Son los valores usados en 64 bits
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
 
Posts: 41314
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Re: GetAdaptersInfo ¿DLL32 FUNCION o BEGINDUMP/ENDDUMP?

Postby JmGarcia » Thu Mar 24, 2016 11:35 pm

Si ejecutas este programa de ejemplo en 32bits el Sizeof te devuelve 40 bytes y en 64bits te devuelve 48 bytes.
Las variables que se duplican son las de tipo DWORD/LONG o puntero(*) que son LONG también.
Code: Select all  Expand view
function main()
   MsgInfo(ESTRUCTURA())
return nil

#pragma BEGINDUMP
#include <windows.h>
#include <hbapi.h>
#include <hbapiitm.h>
#include <Iphlpapi.h>
HB_FUNC( ESTRUCTURA )
{
typedef struct {
  char String[4 * 4];
} IP_ADDRESS_STRING, *PIP_ADDRESS_STRING, IP_MASK_STRING, *PIP_MASK_STRING;
typedef struct {
  struct _IP_ADDR_STRING  *Next;    // Puntero(*) 4 bytes en 32bits, 8 bytes en 64bits
  IP_ADDRESS_STRING      IpAddress; // String 16 bytes
  IP_MASK_STRING         IpMask;    // String 16 bytes
  DWORD                  Context;   // DWORD 4 bytes en 32bits, 8 bytes en 64bits
} IP_ADDR_STRING, *PIP_ADDR_STRING;
hb_retni( sizeof (IP_ADDR_STRING) ) ;
}
#pragma ENDDUMP


O prueba con esta estructura.
Code: Select all  Expand view
HB_FUNC( ESTRUCTURA )
{
typedef struct {
  DWORD  Variable; // DWORD 4 bytes en 32bits, 8 bytes en 64bits
} PRUEBA, *PRUEBA;
}
#pragma ENDDUMP

Información sobre números largos: https://msdn.microsoft.com/en-us/library/windows/desktop/aa383710(v=vs.85).aspx
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
User avatar
JmGarcia
 
Posts: 654
Joined: Mon May 29, 2006 3:14 pm
Location: Madrid - ESPAÑA

Re: GetAdaptersInfo ¿DLL32 FUNCION o BEGINDUMP/ENDDUMP?

Postby JmGarcia » Fri Mar 25, 2016 12:31 am

El comienzo de la estructura IP_ADAPTER_INFO en 32bits son dos variables de 4+4 = 8 bytes y en 64bits 8+4 = 12 bytes
Code: Select all  Expand view
cBuffer en 32bts      cBuffer en 64bts
 
 12345678              123456789012
---------------------------------------
 ........{3C195B8      ..>.........{3C1
 8-0DDC-49CE-8BB9      95B88-0DDC-49CE-
 -5610B76EE504}..      8BB9-5610B76EE50
 ................      4}..............
 ................      ................
 ................      ................
 ................      ................
 ................      ................
 ................      ................
 ................      ................
 ................      ................
 ................      ................
 ................      ................
 ................      ................
 ................      ................
 ................      ................
 ............HP h      ................
 s2340 HSPA+ Mobi      HP hs2340 HSPA+
 le Broadband Mod      Mobile Broadband
 ule Network Adap       Module Network
 ter.............      Adapter.........

Detalle en hexadecimal.
Code: Select all  Expand view
B0 9D 91 00 0F 00 00 00 7B 33 43 31 39 35 42 38    ........{3C195B8 // 32bits
D0 C7 3E 00 00 00 00 00 0F 00 00 00 7B 33 43 31    ..>.........{3C1 // 64bits
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
User avatar
JmGarcia
 
Posts: 654
Joined: Mon May 29, 2006 3:14 pm
Location: Madrid - ESPAÑA


Return to FiveWin para Harbour/xHarbour

Who is online

Users browsing this forum: No registered users and 76 guests