Один программист спрашивает другого:
- Слушай, а тебе трахаться приходилось?
- Да, как-то раз я полночи Windows ставил.
- Да нет, в смысле по-настоящему.
- А, это с Макинтошами что ли?
Для того, чтобы этот код работал, необходимо включить в проект юнит NB30. Простой вызов функции GetMACAddress возвращает адрес первого установленного сетевого адаптера.
uses
NB30;
function GetAdapterInfo(Lana: Char): string;
var
Adapter: TAdapterStatus;
NCB: TNCB;
begin
FillChar(NCB, SizeOf(NCB), 0);
NCB.ncb_command := Char(NCBRESET);
NCB.ncb_lana_num := Lana;
if Netbios(@NCB) <> Char(NRC_GOODRET) thenbegin
Result := 'mac not found';
Exit;
end;
FillChar(NCB, SizeOf(NCB), 0);
NCB.ncb_command := Char(NCBASTAT);
NCB.ncb_lana_num := Lana;
NCB.ncb_callname := '*';
FillChar(Adapter, SizeOf(Adapter), 0);
NCB.ncb_buffer := @Adapter;
NCB.ncb_length := SizeOf(Adapter);
if Netbios(@NCB) <> Char(NRC_GOODRET) thenbegin
Result := 'mac not found';
Exit;
end;
Result :=
IntToHex(Byte(Adapter.adapter_address[0]), 2) + '-' +
IntToHex(Byte(Adapter.adapter_address[1]), 2) + '-' +
IntToHex(Byte(Adapter.adapter_address[2]), 2) + '-' +
IntToHex(Byte(Adapter.adapter_address[3]), 2) + '-' +
IntToHex(Byte(Adapter.adapter_address[4]), 2) + '-' +
IntToHex(Byte(Adapter.adapter_address[5]), 2);
end;
function GetMACAddress: string;
var
AdapterList: TLanaEnum;
NCB: TNCB;
begin
FillChar(NCB, SizeOf(NCB), 0);
NCB.ncb_command := Char(NCBENUM);
NCB.ncb_buffer := @AdapterList;
NCB.ncb_length := SizeOf(AdapterList);
Netbios(@NCB);
if Byte(AdapterList.length) > 0 then
Result := GetAdapterInfo(AdapterList.lana[0])
else
Result := 'mac not found';
end;
Программный код, написанный на языке Delphi (Pascal), предназначен для получения MAC-адреса компьютера с помощью API NetBIOS.
Функция GetAdapterInfo принимает локальный номер сети (LAN) в качестве входного параметра и возвращает MAC-адрес сети адаптера, связанного с этим LAN. Функция использует два функции NetBIOS: Netbios и NetbiosReset. Первая функция используется для отправки запроса на сервер NetBIOS, а вторая - для сброса соединения.
Процесс работы следующий:
Инициализируется пустой буфер (NCB) и устанавливается команда NCBRESET, которая сбрасывает соединение NetBIOS.
Затем отправляется запрос на сервер NetBIOS с помощью функции Netbios. Запрос включает в себя локальный номер сети и команду NCBRESET.
Если ответ успешен, то устанавливается другой буфер (Adapter) и отправляется запрос для получения информации о адаптере с помощью команды NCBASTAT.
Полученная информация об адаптере сохраняется в буфере Adapter, а затем извлекается MAC-адрес из него.
Функция GetMACAddress получает список всех установленных на системе сетевых адаптеров, вызывая функцию Netbios с командой NCBENUM. Затем она вызывает функцию GetAdapterInfo для получения MAC-адреса каждого адаптера в списке и возвращает первый найденный адрес. Если не найдено адаптеров, то возвращается сообщение об ошибке.
В улучшенной версии кода выполнены следующие изменения:
Удалены ненужные вызовы функции FillChar и буферы инициализируются напрямую.
Сокращен обработчик ошибок с помощью единственного оператора Exit.
Используется функция Format для форматирования MAC-адреса в более читаемом виде.
Обратите внимание, что это код требует включения модуля NB30 в проект.
В статье описывается способ получения MAC-адреса компьютера с помощью функции GetMACAddress, которая использует библиотеку NB30 и вызывает функцию Netbios для получения информации о сетевых адаптерах.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.