Итак, в свое время я делал для себя программу, которая должна была считывать текущие настройки сети и показывать их в программе. Далее, я мог эти настройки сохранить в файл, кроме этого, я мог ввести настройки сети (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-кодировке.
В конце я удаляю данный файл, хотя это не обязательно. В принципе смысл понятен, тут главное было правильно составить команду 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-адрес.