كيف أحصل على عنوان MAC لبطاقة شبكة باستخدام Delphi؟

StackOverflow https://stackoverflow.com/questions/577071

  •  05-09-2019
  •  | 
  •  

سؤال

حسب العنوان - هل يمكن لأي شخص أن يساعدني؟

هل كانت مفيدة؟

المحلول

احصل على تحويل Jedi لمكتبة مساعد Microsoft IP من مشروع Jedi API Header Library - الملف Iphlpapi.zip. فك الملفات، تحتاج إلى iptypes.pas و iphlpapi.pas. ثم يمكنك استخدام شيء مثل هذا:

procedure TForm1.Button1Click(Sender: TObject);
var
  NumInterfaces: Cardinal;
  AdapterInfo: array of TIpAdapterInfo;
  OutBufLen: ULONG;
  i: integer;
begin
  GetNumberOfInterfaces(NumInterfaces);
  SetLength(AdapterInfo, NumInterfaces);
  OutBufLen := NumInterfaces * SizeOf(TIpAdapterInfo);
  GetAdaptersInfo(@AdapterInfo[0], OutBufLen);

  Memo1.Lines.Clear;
  for i := 0 to NumInterfaces - 1 do begin
    Memo1.Lines.Add(Format('%.2x:%.2x:%.2x:%.2x:%.2x:%.2x',
      [AdapterInfo[i].Address[0], AdapterInfo[i].Address[1],
       AdapterInfo[i].Address[2], AdapterInfo[i].Address[3],
       AdapterInfo[i].Address[4], AdapterInfo[i].Address[5]]));
  end;
end;

(تم حذف جميع معالجة الأخطاء، يجب عليك إضافتها بالطبع.)

نصائح أخرى

ال GetAdaptersAdDresses هي الطريقة المفضلة للحصول على معلومات المحولات منذ عام 2001 مع نظام التشغيل Windows XP.

يتم إرجاع معلومات المحول في IP_ADAPTER_ADDRESSES هيكل بواسطة AdapterAddresses معامل.

ال GetAdaptersAddresses وظيفة يمكن استرداد المعلومات ل IPv4. و IPv6. عناوين.

الطريقة الموصى بها للاتصال GetAdaptersAddresses الوظيفة هي لتخصيص ما قبل تخصيص عازلة عمل 15 كيلو بايت أشار إليها AdapterAddresses معامل. على أجهزة الكمبيوتر النموذجية، هذا يقلل بشكل كبير من الفرص التي GetAdaptersAddresses عودة الدالة ERROR_BUFFER_OVERFLOW, ، والتي سوف تتطلب الاتصال GetAdaptersAddresses وظيفة عدة مرات.


procedure TForm1.Button1Click(Sender: TObject);
const
  AF_UNSPEC = 0;
  GAA_FLAG_INCLUDE_ALL_INTERFACES = $100;
  WORKING_BUFFER_SIZE = 15000;
  MAX_TRIES = 3;
var
  pAddresses,
  pCurrAddresses: PIpAdapterAddresses;
  dwRetVal,
  outBufLen: Cardinal;
  i: Integer;
  macAddress: string;
begin
  Memo1.Lines.Clear;

  outBufLen := WORKING_BUFFER_SIZE;
  pAddresses := nil;
  i := 0;
  repeat
    if Assigned(pAddresses) then
      FreeMem(pAddresses);

    GetMem(pAddresses, outBufLen);
    if not Assigned(pAddresses) then
      raise Exception.Create('Memory allocation failed for IP_ADAPTER_ADDRESSES struct');

    dwRetVal := GetAdaptersAddresses(AF_UNSPEC, GAA_FLAG_INCLUDE_ALL_INTERFACES, nil, pAddresses, @outBufLen);
    Inc(i);
  until (dwRetVal <> ERROR_BUFFER_OVERFLOW) or (i = MAX_TRIES);

  try
    if NO_ERROR <> dwRetVal then begin
      if ERROR_NO_DATA = dwRetVal then begin
        MessageDlg('No addresses were found for the requested parameters', mtInformation, [mbOK], 0);
        Exit;
      end
      else
        raise Exception.Create(SysErrorMessage(dwRetVal));
    end;

    pCurrAddresses := pAddresses;
    while Assigned(pCurrAddresses) do begin
      if pCurrAddresses^.PhysicalAddressLength > 0 then begin
        Memo1.Lines.Add(pCurrAddresses^.FriendlyName);
        macAddress := '';
        for i := 0 to pCurrAddresses^.PhysicalAddressLength - 1 do begin
          if i > 0 then
            macAddress := macAddress + ':';
          macAddress := macAddress + Format('%.2X', [pCurrAddresses^.PhysicalAddress[i]]);
        end;
        Memo1.Lines.Add(macAddress);
        Memo1.Lines.Add('');
      end;
      pCurrAddresses := pCurrAddresses^.Next;
    end;

  finally
    if Assigned(pAddresses) then
      FreeMem(pAddresses);
  end;
end;

دون معرفة أي شيء تقريبا على الإطلاق عن Delphi، ماذا عن تشغيل٪ System32٪ ipconfig.exe / ALL ويحلل الإخراج؟

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top