Итак, в свое время я делал для себя программу, которая должна была считывать текущие настройки сети и показывать их в программе. Далее, я мог эти настройки сохранить в файл, кроме этого, я мог ввести настройки сети (TCP/IP — ip-адрес, маску, dns-сервера) вручную и также добавить (сохранить) в файл. В программе была возможность редактирования настроек сети, удаление и так далее. А смысл всего этого был в том, что Вы постепенно добавляли различные конфигурации сети и при запуске программы появлялся этот список сохраненных настроек (загружался из файла), далее мы выбирали нужную нам позицию и нажимали на кнопку «Установить», после чего все эти настройки сети (Ip-адрес, маска подсети, основной шлюз, dns-сервера) устанавливались в наше подключение по локальной сети. Это все было сделано для того: у многих сейчас есть и ноутбуки и обычные компьютеры, так вот с ноутбуком многие люди и дома его используют, и на работу ходят, и в университет, например, на учебу. Каждый раз подключаются к сети (на работе, в университете, дома и так далее). Так вот, когда подключаетесь к сети, необходимо установить нужные для данной сети настройки (прописать ip-адреса, маску и т.д). Это приходится делать вручную, любо создавать для каждого места отдельное подключение. А в программе все настройки хранятся, Вам остается лишь выбрать нужную и нажать на кнопку «Установить», после чего продолжить работать. Да, конечно была идея сделать то, что при подключении сетевого кабеля, программа бы сама устанавливала необходимую конфигурацию, но тут было бы намного сложнее сделать.

Ну, как Вы поняли из заголовка статьи, в моей программе необходимо было реализовать считывание текущих параметров сети, для того, чтобы пользователю не вводить их вручную, а просто нажать считать и добавить их в общий список. Вот так выглядит главное окно моей программы:

А вот так выглядит окно с текущей конфигурацией компьютера:


При нажатии на кнопку «Добавить в список» данная конфигурация добавлялась в файл и в главное окно программы. Думаю, смысл программы Вы поняли.

Ну вот мы теперь будем постепенно рассматривать как такую программу можно сотворить самому. Я не в курсе имеются ли такие бесплатные программы, перед ее разработкой я не искал подобного, сразу приступил к ее разработки.

Почему в статье имеется Часть 1. Потому что я смог определить как минимум 2 способа получения текущей конфигурации сети. Скажу сразу, что первый способ получение конфигурации настроек сети — системный реестр, а второй способ — получение настроек сети через командную строку (cmd.exe).

Первый способ немного сложнее, ну а второй кому как, мне он очень понравился. Ну что приступим.

Начнем мы с создания нового проекта. На форме у меня следующие компоненты:

  • TTimer
  • TButton
  • TMemo

Итак проект наш готов. Свойство Enabled компонента TTimer я установил в False.

По нажатию на кнопку нам необходимо запустить команду, которая выгрузит все наши данные в текстовый файл. Для этого я подготовил bat-файл и поместил его в корень с программой. Конечно, Вы его можете создавать при запуске программы, ну а затем после ее работы удалять его, это уже кому как удобно. BAT-файл у меня вышел следующего содержания:

netsh -c interface dump > homesettings.txt

То есть, по нажатию на кнопку, мы его просто запускаем, на событии OnClick нашей кнопки у меня написан следующий код:

procedure TForm1.Button1Click(Sender: TObject);
begin
   ShellExecute(Handle,nil,'run.bat','','',SW_SHOW);
   Timer1.Enabled:=True;
end;

Не забудьте подключить в Uses модуль Shellapi. И как Вы уже поняли, исходя из того, что написано в bat-файле, то он что-то экспортирует в файл homesettings.txt, причем он создается сам данный файл и в каталоге  с нашей программой.

Тут есть небольшой минус того, что если в файле присутствует русские буквы, то они находятся в DOS-кодировки, соответственно для этого Вам еще дополнительно придется перекодировать текст, но ничего страшного, это мы также рассмотрим. То есть, в данный файл выводится информация о Вашем подключении, а если оно у Вас на русском языке (Подключение по локальной сети 1 и так далее), то естественно оно будет в DOS-кодировки.

Тут еще имеется один нюанс, соответственно для этого я и поместил на форму TTimer. Может можно как-то и проще сделать и рациональней, но я решил таким образом. То есть, когда выполняется наш bat-файл, он сразу создает данный файл c настройками сети и постепенно начинает экспортировать в файл информацию (то есть занимает данный файл). Следовательно, мы не сможем загрузить наш файл с информацией до тех пор, пока не выполниться наш bat-файл. Это проблему я решил следующим образом: функцией проверять, закрыт ли наш файл или нет.

Вот функция, которая это делает

function IsFileInUse(fName : string) : boolean;
var HFileRes : HFILE;
begin
  Result := False;
  if not FileExists(fName) then
    Exit;
  HFileRes := CreateFile(pchar(fName),
                         GENERIC_READ or GENERIC_WRITE,
                         0, nil, OPEN_EXISTING,
                         FILE_ATTRIBUTE_NORMAL, 0);
  Result := (HFileRes = INVALID_HANDLE_VALUE);
  if not Result then
    CloseHandle(HFileRes);
end;

Далее, на событие OnTimer нашего таймера необходимо написать код, который будет каждые 10 миллисекунд проверять наш файл (занят ли он другим приложением, а точнее нашим bat-файлом), а затем загружать наш файл в переменную, с результатами выгрузки данных, и начинать его парсить. Вообще парсер я написал свой, Вы напишите для себя свой, то есть, как только появиться файл с настройками Вы сами увидите, что необходимо парсить и какие данные. Вот код на событии OnTimer

procedure TForm1.Timer1Timer(Sender: TObject);
var
 ListSetting:TStringList;
 ssetting:String;
 s:array[0..255] of Char;
begin
  try
   if IsFileInUse('homesettings.txt')=False then
    begin
     Timer1.Enabled:=False;
     ListSetting:=TStringList.Create;
     ListSetting.LoadFromFile('homesettings.txt');
     ssetting:=ListSetting.Text;
     if (flag=0) and (pos('name="',ssetting)<>0) then
      begin
       OemToChar(PChar(Pars(ssetting,'name=','" source',0)),s);
       Delete(ssetting,pos('name="',ssetting),pos('" source',ssetting));
       Memo1.Lines.Add(s);
       flag:=1;
       Timer1.Enabled:=True;
      end;
     if (flag=1) and (pos('static addr',ssetting)<>0) then
      begin
       Timer1.Enabled:=False;
       Memo1.Lines.Add(Pars(ssetting,'static addr',' mask',0));
       flag:=2;
       ListSetting.Free;
       DeleteFile('homesettings.txt');
      end;
    end;
   except
    on e:Exception do
     //-//-//-//-//-//-//-//
   end;
end;

Вначале проверяем файл на занятость. Затем мы загружаем в переменную наш файл, ну а после парсим его и получаем нужные нам данные. Тут я использовал преобразование кодировки из DOS в Windows, так как у меня мое подключение называется «Подключение по локальной сети» мне bat-файл экспортировал в текстовый файл это название в DOS-кодировке.

Внимание! Данный код тестировался только в Windows XP и на моих настройках сети (это касается парсера)

В конце я удаляю данный файл, хотя это не обязательно. В принципе смысл понятен, тут главное было правильно составить команду bat-файла, а остальное все ерунда. Дальше мы рассмотрим, как получить данные настроек сети через реестр, тут с одной стороны будет полегче, так как парсить ничего не надо, а с другой могут возникнуть трудности, ну ничего скоро все увидите сами. Ну и конечно же посмотрим как можно установить конкретные настройки сети с помощью того же bat-файла, а также с помощью реестра.

Ну да и моя простая функция парсинга:

function Pars(str:String;str_begin:String;str_end:String;count:integer):String;
begin
   Delete(str,1,pos(str_begin,str)+length(str_begin));
   Delete(str,pos(str_end,str)-count,length(str));
   Pars:=str;
end;

В итоге вот, что у меня вышло в результате выполнения программы

То есть, результатом стало — название моего сетевого подключения и ip-адрес.

Исходник скачать можно тут

Метки: , ,




К записи “Получаем настройки сети. Часть 1” оставлено комментариев: 14.

  1. Wallaby:

    Охренеть…. IP helper API не осилил?

    • Andrey53:

      а это что не вариант? Я ip helper API не юзал, но через командную строку можно получать достаточно много информации в том числе и по сети. Думаю даже больше чем через IP helper API, но на днях обязательно посмотрю данный API, если получиться то напишу про него что-нибудь, но я перечисляю как вариант получения и установки значений сети, дальше рассмотрю как это организовать через реестр.

  2. Йцукен:

    А использовать ShellExecuteEx + WaitForSingleObject для ожидания завершения батника религия не позволяет?

  3. Cuba:

    Андрей мы с нетерпением ждем продолжения вашей статьи. За все остальное БОЛЬШОЕ СПАСИБО!

  4. MsConfig:

    Здравствуйте. Я так понимаю эта программа показывает имя активного сетевого подключения ? Я так и не увидел как получить параметры сети. Меня интересует основной шлюз, как можно его узнать и его ip вывести в программу, к примеру в Label. Облазил весь Интернет и ничего путного не нашел. Если подскажите как это реализовть в виде кода Delphi буду признателен.

  5. MsConfig:

    Буду ждать…Спасибо.

  6. А исходник программы на первых двух картинках можно как нибудь получить? Если да — скиньте плиз на мыло x25xe.dog@gmail.com или стукните в аську 277273556. заранее благодарен)

  7. А когда будет продолжение ? Статейка интересная, а вот програмку сами писали ?? Если нет то поделитесь секретом от кокого ресурса взято.

  8. User:

    ВещЪ Оригинальный подход , а чё.

    Зато человек старался сам, и учитывая его объем знаний, у него получилось. Хоть и смешно ))).

    А вот здесь Вундерсринды из sql.ru , «местные гуру» с сообщениями на форуме более 20 000 у каждого, вообще не ведают о том: какое различие между диапазоном ip-адресов и даже формы записи ip-адресов не знают. И вот с таким богатым объемом знаний они еще успевают «поржать».

Оставить комментарий

Вы можете использовать следующие теги: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

*