كيف أحصل على عنوان MAC لبطاقة شبكة باستخدام Delphi؟
-
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 ويحلل الإخراج؟