Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 09.10.2018, 14:14   #1
Bragin
 
Регистрация: 03.05.2017
Сообщений: 4
По умолчанию Есть такой код получения MAC по IP. Но если меняю IP на Edit1.text выдаёт ошибку про PAnsiChar. Что делать?

Код:
unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Winsock, ExtCtrls, Vcl.StdCtrls;

const
 MAX_ADAPTER_ADDRESS_LENGTH = 6;


type
TMacAddress = array[0..MAX_ADAPTER_ADDRESS_LENGTH - 1] of byte;

  TForm1 = class(TForm)
    Button1: TButton;
    Edit1: TEdit;
    Label1: TLabel;
    Memo1: TMemo;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

 function SendARP(const DestIP, SrcIP: ULONG;
   pMacAddr: PULONG; var PhyAddrLen: ULONG): DWORD; stdcall; external 'IPHLPAPI.DLL';

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
function GetMAC(Value: TMacAddress; Length: DWORD): String;
 var
   I: Integer;
 begin
   if Length = 0 then Result := '00-00-00-00-00-00' else
   begin
     Result := '';
     for i:= 0 to Length - 2 do
       Result := Result + IntToHex(Value[i], 2) + '-';
     Result := Result + IntToHex(Value[Length-1], 2);
   end;
 end;

var
 DestIP, SrcIP: ULONG;
 pMacAddr: TMacAddress;
 PhyAddrLen: ULONG;
begin
 DestIP := inet_addr('192.168.67.157');
 PhyAddrLen := 6;
 SendArp(DestIP, 0, @pMacAddr, PhyAddrLen);
 Caption := GetMAC(pMacAddr, PhyAddrLen);
end;

end.

Последний раз редактировалось Аватар; 12.10.2018 в 17:58.
Bragin вне форума Ответить с цитированием
Старый 09.10.2018, 14:21   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

Edit1.text у вас скорее всего юникодный, а inet_addr хочет анси строку. Что делать? Конвертировать или использовать что-то из семейства RtlIpv4StringToAddress.
p51x на форуме Ответить с цитированием
Старый 09.10.2018, 14:41   #3
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

Код:
  PhyAddrLen: ULONG;
  str_IP : AnsiString;
begin
  str_IP := Edit1.Text;
  DestIP := inet_addr( str_IP );
Serge_Bliznykov вне форума Ответить с цитированием
Старый 10.10.2018, 09:23   #4
Bragin
 
Регистрация: 03.05.2017
Сообщений: 4
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
Код:
  PhyAddrLen: ULONG;
  str_IP : AnsiString;
begin
  str_IP := Edit1.Text;
  DestIP := inet_addr( str_IP );
[dcc32 Warning] Unit1.pas(58): W1058 Implicit string cast with potential data loss from 'TCaption' to 'AnsiString'
[dcc32 Error] Unit1.pas(59): E2010 Incompatible types: 'PAnsiChar' and 'AnsiString'
Bragin вне форума Ответить с цитированием
Старый 10.10.2018, 09:29   #5
Bragin
 
Регистрация: 03.05.2017
Сообщений: 4
По умолчанию

Ладно пойдём по другому. Может у кого ни будь есть рабочий код по Delphi XE для получения MAC адреса. Я получаю в своей программе локальный (свой) IP и по нему нужно отпределить какой MAC данной сетевухи.

Рассматривал некоторые варианты, которые просто определяют MAC, но:
- у меня 2 сетевухи WiFi и кабель. При подключенном WiFi подключаю кабель и трафик начинает ходить через проводную сетевуху и естественно моя прога определяет IP уже проводной сетевухи, НО МАC определяеться всё равно WiFi сетевухи.

Можно ли как то определить МАК активной сетевухи? Delphi XE
Bragin вне форума Ответить с цитированием
Старый 10.10.2018, 09:44   #6
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

у меня нет современной Delphi
в PChar можно попробовать преобразовать так
Код:
DestIP := inet_addr( PChar(str_IP) );
Serge_Bliznykov вне форума Ответить с цитированием
Старый 10.10.2018, 09:49   #7
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

Цитата:
Сообщение от Bragin Посмотреть сообщение
Можно ли как то определить МАК активной сетевухи?
я в этом не компетентен. попробуйте разобраться в статье - https://stackoverflow.com/questions/...ysical-adapter

Последний раз редактировалось Alex11223; 06.05.2019 в 17:53.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 12.10.2018, 08:35   #8
Bragin
 
Регистрация: 03.05.2017
Сообщений: 4
По умолчанию Эврика!

Всем спасибо! Нашёл решение!

Код:
unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Winsock, ExtCtrls, Vcl.StdCtrls,
  IdBaseComponent, IdComponent, IdIPWatch;

const
 MAX_ADAPTER_ADDRESS_LENGTH = 6;


type
TMacAddress = array[0..MAX_ADAPTER_ADDRESS_LENGTH - 1] of byte;
//PChar = PansiChar;

  TForm1 = class(TForm)
    Button1: TButton;
    Edit1: TEdit;
    IdIPWatch1: TIdIPWatch;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

 function SendARP(const DestIP, SrcIP: ULONG;
   pMacAddr: PULONG; var PhyAddrLen: ULONG): DWORD; stdcall; external 'IPHLPAPI.DLL';

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
function GetMAC(Value: TMacAddress; Length: DWORD): String;
 var
   I: Integer;
 begin
   if Length = 0 then Result := '00-00-00-00-00-00' else
   begin
     Result := '';
     for i:= 0 to Length - 2 do
       Result := Result + IntToHex(Value[i], 2) + '-';
     Result := Result + IntToHex(Value[Length-1], 2);
   end;
 end;
type PChar = PWideChar;
var
 DestIP, SrcIP: ULONG;
 pMacAddr: TMacAddress;
 PhyAddrLen: ULONG;
begin
 IdIPWatch1.Active:=true; //Определяем IP
 Edit1.text:=IdIPWatch1.LocalIP; //Определяем IP

 DestIP := inet_addr(PAnsiChar(AnsiString(Edit1.Text)));
 PhyAddrLen := 6;
 SendArp(DestIP, 0, @pMacAddr, PhyAddrLen);
 Caption := GetMAC(pMacAddr, PhyAddrLen); //Всё остальное и это - определяем MAC
end;

end.
_____
Код программы нужно выделять (форматировать) тегами [CODE] (читать FAQ)
Модератор

Последний раз редактировалось Serge_Bliznykov; 12.10.2018 в 09:57.
Bragin вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Какой будет результат если написать такой код Son1098 Общие вопросы C/C++ 3 24.10.2016 19:57
как сделать так что если textbox пустое то выдаёт ошибку Сеня# C# (си шарп) 9 01.04.2015 18:06
На Win7x64 видеокарта GeForce GT 640 выдаёт ошибку код 43 Savinia Операционные системы общие вопросы 1 25.12.2013 23:48
Код символа "BackSpase" в ANSI(Если такой есть...) ChEaTeR-abc Помощь студентам 3 30.06.2010 17:39