La función NetBios(), cuyo prototipo y estructuras asociadas se encuentran en el módulo Nb30, permite ejecutar diferentes comandos de servicios de red, entre ellos uno, llamado NCBASTAT, que permite obtener distinta información acerca del estado y configuración de los adaptadores.
Para poder recuperar la dirección MAC, que es lo que interesa, básicamente hay que preparar una estructura TNcb, con los parámetros apropiados, y a continuación llamar a NetBios() para obtener la información. En este caso habría que facilitar el número de adaptador, un nombre y la dirección y longitud de un bloque de memoria en el que se devolverá el resultado. Tras la llamada, el miembro adapter_address, que es una matriz de seis elementos, contendrá los bytes que identifican a la tarjeta.
Para obtener la dirección IP propia, lo más fácil, es usar las funciones Windows sockets. Básicamente se llama a gethostname(), para obtener el nombre de nuestro ordenador, y a continuación a gethostbyname(), que devuelve una estructura de datos en las que están contenidas las direcciones IP. Para convertir esas direcciones, que están almacenadas en cuatro bytes, en una cadena, lo más simple es usar la función inet_ntoa(). Todas estas funciones están documentadas en la API de Windows.
En este ejemplo, al pulsar un botón en el formulario, se obtiene y muestra tanto la dirección MAC como la IP. Para mantener la simplicidad tan sólo se obtiene la primera dirección de cada tipo, pero bastaría un bucle para recuperar otras que pudieran existir en caso de que el sistema contase con varios adaptadores.
uses Nb30, Winsock;
procedure TForm1.Button1Click(Sender: TObject);
type
// Una estructura que une el estado del adaptador
// con una matriz de estructuras TNameBuffer
ASTAT = record
adapt: TAdapterStatus;
NameBuff: Array[0..29] Of TNameBuffer;
end;
var
Adaptador: ASTAT;
Ncb: TNCB;
Nombre: String;
DatosSocket: WSAData;
BloqueIP: PHostEnt;
DirIP: in_addr;
begin
with Ncb Do // Inicializamos la estructura para ejecutar
begin // el comando NCBSTAT
ncb_command := char(NCBASTAT);
ncb_lana_num := char(0); // asumimos que sólo hay un adaptador
ncb_callname := '*'; // y no facilitamos nombre
ncb_buffer := @Adaptador; // dirección de la estructura para obtener
ncb_length := sizeof(Adaptador); // los datos devueltos
end;
Netbios(@Ncb); // Llamada a NetBios
// Mostramos los datos
with Adaptador.adapt Do
ShowMessage('La dirección MAC es: ' +
IntToHex(Integer(adapter_address[0]), 2) +
IntToHex(Integer(adapter_address[1]), 2) +
IntToHex(Integer(adapter_address[2]), 2) +
IntToHex(Integer(adapter_address[3]), 2) +
IntToHex(Integer(adapter_address[4]), 2) +
IntToHex(Integer(adapter_address[5]), 2));
WSAStartup($0101, DatosSocket); // Inicializamos Windows sockets
SetLength(Nombre, MAX_PATH); // y obtenemos el nombre de nuestro equipo
gethostname(PChar(Nombre), MAX_PATH);
// que usamos para obtener un bloque de información sobre IP
BloqueIP := gethostbyname(PChar(Nombre));
// del cual recuperamos la dirección
CopyMemory(@DirIP, (BloqueIP^).h_addr_list^, BloqueIP.h_length);
ShowMessage(inet_ntoa(DirIP)); // y la mostramos
end;
|