Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

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

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

Ответ
 
Опции темы
Старый 09.10.2018, 15:14   #1
Bragin
 
Регистрация: 03.05.2017
Сообщений: 4
Репутация: 10
По умолчанию Есть такой код получения 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 в 18:58.
Bragin вне форума   Ответить с цитированием
Старый 09.10.2018, 15:21   #2
p51x
Профессионал
 
Регистрация: 15.02.2010
Сообщений: 12,301
Репутация: 2073

icq: 216409213
По умолчанию

Edit1.text у вас скорее всего юникодный, а inet_addr хочет анси строку. Что делать? Конвертировать или использовать что-то из семейства RtlIpv4StringToAddress.
__________________
Запомните раз и навсегда: помочь != "решите за меня"!
p51x на форуме   Ответить с цитированием
Старый 09.10.2018, 15:41   #3
Serge_Bliznykov
МегаМодератор
СуперМодератор
 
Регистрация: 09.01.2008
Сообщений: 24,380
Репутация: 5308
По умолчанию

Код:

  PhyAddrLen: ULONG;
  str_IP : AnsiString;
begin
  str_IP := Edit1.Text;
  DestIP := inet_addr( str_IP );

Serge_Bliznykov на форуме   Ответить с цитированием
Старый 10.10.2018, 10:23   #4
Bragin
 
Регистрация: 03.05.2017
Сообщений: 4
Репутация: 10
По умолчанию

Цитата:
Сообщение от 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, 10:29   #5
Bragin
 
Регистрация: 03.05.2017
Сообщений: 4
Репутация: 10
По умолчанию

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

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

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

у меня нет современной Delphi
в PChar можно попробовать преобразовать так
Код:

DestIP := inet_addr( PChar(str_IP) );

Serge_Bliznykov на форуме   Ответить с цитированием
Старый 10.10.2018, 10:49   #7
Serge_Bliznykov
МегаМодератор
СуперМодератор
 
Регистрация: 09.01.2008
Сообщений: 24,380
Репутация: 5308
По умолчанию

Цитата:
Сообщение от Bragin Посмотреть сообщение
Можно ли как то определить МАК активной сетевухи?
я в этом не компетентен. попробуйте разобраться в статье - http://qaru.site/questions/915764/lo...ysical-adapter
Serge_Bliznykov на форуме   Ответить с цитированием
Старый 12.10.2018, 09:35   #8
Bragin
 
Регистрация: 03.05.2017
Сообщений: 4
Репутация: 10
По умолчанию Эврика!

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

Код:

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 в 10:57.
Bragin вне форума   Ответить с цитированием
Ответ

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

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


16:08.


Powered by vBulletin® Version 3.8.8 Beta 2
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.

RusProfile.ru


Справочник российских юридических лиц и организаций.
Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru