GRACIAS a vosotros por probarlo y responder.
A veces uno piensa que ésto es como en el chiste: "... hay alguien más?".

Bueno yo le añadiría.-
...
if( dwRetVal != NO_ERROR && dwRetVal != ERROR_NO_DATA ){
...
Prefiero que me devuelva Array vacía si no hay adaptadores.
Un saludo
Xavi
PD: Qedaría así y que cada uno se lo cambie como quiera .-
//---------------------------------------------------------- --------------------
METHOD FormInitialize( oSender ) CLASS TIPConfigAll
Local aAdapter, aAdapters := GetAdaptersInfo()
::oMemo:Value := CRLF
for each aAdapter in aAdapters
::oMemo:Value += aAdapter[1] + ' ' + aAdapter[2] + CRLF
::oMemo:Value += "MAC Address ...... : " + aAdapter[3] + CRLF
::oMemo:Value += "Address ...... : " + aAdapter[4] + CRLF
::oMemo:Value += "Mask ...... : " + aAdapter[5] + CRLF
::oMemo:Value += "Gateway ...... : " + aAdapter[6] + CRLF
::oMemo:Value += CRLF
next
RETURN Nil
//---------------------------------------------------------- --------------------
#pragma BEGINDUMP
#include <windows.h>
#include <xailer.h>
// ¡ATENCIí“N! Compilar con Iphlpapi.LIB del C
// para Borland C/C++ en ruta por defecto .-
// Incluir en el proyecto C:BorlandBCC55LibPSDKIphlpapi.lib
#include <Iphlpapi.h>
#include "hbapierr.h"
/*********************************************************** **********
* CAPTURA INFORMACIí“N DE ADAPTADORES (IPConfig /All)
* ------------------------------------------------------
* aAdapters := GetAdaptersInfo()
* aAdapters : { {cTipo, cNameDes, cMAC, cAddress, cMask, cGateway} }
************************************************************ **********/
XA_FUNC( GETADAPTERSINFO )
{
DWORD dwRetVal;
ULONG i, ulOutBufLen = sizeof(IP_ADAPTER_INFO);
PIP_ADAPTER_INFO pAdapterInfo = (IP_ADAPTER_INFO *)hb_xgrab( sizeof(IP_ADAPTER_INFO) );
PHB_ITEM pItmArray = hb_itemNew( NULL ); hb_arrayNew( pItmArray, 0 );
if( (dwRetVal = GetAdaptersInfo( pAdapterInfo, &ulOutBufLen )) == ERROR_BUFFER_OVERFLOW ){
hb_xfree( pAdapterInfo );
pAdapterInfo = (PIP_ADAPTER_INFO)hb_xgrab( ulOutBufLen );
dwRetVal = ERROR_SUCCESS;
}
if( dwRetVal == ERROR_SUCCESS &&
(dwRetVal = GetAdaptersInfo( pAdapterInfo, &ulOutBufLen )) == NO_ERROR ){
PIP_ADAPTER_INFO pAdapter = pAdapterInfo;
char acFrt[4], *szFrtMAC;
HB_ITEM ItmSubarray; ItmSubarray.type = HB_IT_NIL;
while( pAdapter ){
hb_arrayNew( &ItmSubarray, 6 );
switch( pAdapter->Type ){
case MIB_IF_TYPE_OTHER:
hb_itemPutC( hb_arrayGetItemPtr( &ItmSubarray, 1 ), "Other" );
break;
case MIB_IF_TYPE_ETHERNET:
hb_itemPutC( hb_arrayGetItemPtr( &ItmSubarray, 1 ), "Ethernet" );
break;
case MIB_IF_TYPE_TOKENRING:
hb_itemPutC( hb_arrayGetItemPtr( &ItmSubarray, 1 ), "Token Ring" );
break;
case MIB_IF_TYPE_FDDI:
hb_itemPutC( hb_arrayGetItemPtr( &ItmSubarray, 1 ), "FDDI" );
break;
case MIB_IF_TYPE_PPP:
hb_itemPutC( hb_arrayGetItemPtr( &ItmSubarray, 1 ), "PPP" );
break;
case MIB_IF_TYPE_LOOPBACK:
hb_itemPutC( hb_arrayGetItemPtr( &ItmSubarray, 1 ), "Lookback" );
break;
case MIB_IF_TYPE_SLIP:
hb_itemPutC( hb_arrayGetItemPtr( &ItmSubarray, 1 ), "Slip" );
break;
default:
hb_itemPutC( hb_arrayGetItemPtr( &ItmSubarray, 1 ), "Unknown type" );
}
hb_itemPutC( hb_arrayGetItemPtr( &ItmSubarray, 2 ), pAdapter->Description );
szFrtMAC = (char *)hb_xgrab( 3 * pAdapter->AddressLength + 1 );
for( i = 0; i < pAdapter->AddressLength; i++ ){
sprintf( acFrt, "%02X-", pAdapter->Address
);
strcpy( szFrtMAC + (3 * i), acFrt );
}
hb_itemPutCL( hb_arrayGetItemPtr( &ItmSubarray, 3 ), szFrtMAC, 3 * pAdapter->AddressLength - 1 );
hb_xfree( szFrtMAC );
hb_itemPutC( hb_arrayGetItemPtr( &ItmSubarray, 4 ), pAdapter->IpAddressList.IpAddress.String );
hb_itemPutC( hb_arrayGetItemPtr( &ItmSubarray, 5 ), pAdapter->IpAddressList.IpMask.String );
hb_itemPutC( hb_arrayGetItemPtr( &ItmSubarray, 6 ), pAdapter->GatewayList.IpAddress.String );
hb_arrayAddForward( pItmArray, &ItmSubarray );
pAdapter = pAdapter->Next;
}
}
hb_xfree( pAdapterInfo );
hb_itemRelease( hb_itemReturnForward( pItmArray ) );
if( dwRetVal != NO_ERROR && dwRetVal != ERROR_NO_DATA ){
char szErrorMsg[64];
sprintf( szErrorMsg, "GetAdaptersInfo failed with error: %d", dwRetVal );
hb_errRT_BASE_SubstR( EG_ARG, 0, szErrorMsg, NULL, 0 );
}
}
#pragma ENDDUMP
//---------------------------------------------------------- --------------------
--