Модераторы: Snowy, Poseidon, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Смена свого ИП адреса программно 
:(
    Опции темы
Sterling
Дата 16.3.2005, 12:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 26.9.2004

Репутация: нет
Всего: нет



Народ подскажите как такую штуку реализовать в дельфях.
Есть Edit в него вбиваеться ип. Скажем с пробелами или точками. Нажимаешь кнопку и он ставиться в твоей системе в одно из потключений. Потключение выбираеться в ComboBox. Кстати как в него записать все виды потключений меня тоже интересуют =)

Если будут коментарие, то вообще супер!

Зарание благодарен
PM MAIL   Вверх
Snowy
Дата 16.3.2005, 13:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 53
Всего: 484



HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\Tcpip\Parameters\Interfaces
Думаю комментарии там не нужны.
PM MAIL   Вверх
Sterling
Дата 16.3.2005, 14:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 26.9.2004

Репутация: нет
Всего: нет



А как к этому обратиться. Вот в чем прикол то!
PM MAIL   Вверх
z-END
Дата 16.3.2005, 14:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прафесар™
****


Профиль
Группа: Комодератор
Сообщений: 3014
Регистрация: 13.3.2003
Где: Венья, Пиетари

Репутация: 1
Всего: 102



так и обратиться как Snowy написал.
TRegsitry тебе в руки smile


--------------------
Каждый чилавек пасвоему праф...а памоему НЕТ! 

PM WWW ICQ   Вверх
Snowy
Дата 16.3.2005, 15:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 53
Всего: 484



Читай справку по TRegistry
Читай FAQ или DRKB - работа с реестром.
PM MAIL   Вверх
Sterling
Дата 18.3.2005, 07:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 26.9.2004

Репутация: нет
Всего: нет



Почитал, вроде что-то нашел, но вот вопрос. Он мне меняет параметр, и так же ставит тип ключа походу который по умолчанию используеться, а вот как тип указать я так и не разобрался:
Код

procedure TForm1.Button1Click(Sender: TObject);
var
  Registry: TRegistry;
begin
  Registry := TRegistry.Create;
  Registry.RootKey := hkey_local_machine;
  Registry.OpenKey('SYSTEM\ControlSet001\Services\Tcpip\Parameters\Interfaces\{95C19F58-C265-489C-8831-257144D1DEC5}',true);
  Registry.WriteString('IPAddress', edit1.Text );
  Registry.CloseKey;
  Registry.Free;
end;


И еще в ...\interface у меня находятся еще несколько каталогов, например, {95C19F58-C265-489C-8831-257144D1DEC5}, это и есть одно из сетевых потключений?. Но опять же не понятка, сетевуха у меня одна а таких разделов пять. Или это все соединения когда либо созданный у меня на компе?

Это сообщение отредактировал(а) Sterling - 18.3.2005, 08:02
PM MAIL   Вверх
Snowy
Дата 18.3.2005, 08:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 53
Всего: 484



Цитата(Sterling @ 18.3.2005, 07:59)
Или это все соединения когда либо созданный у меня на компе?

Нет, старые интерфейсы удаляются вместе с адаптером.
Эти две ветки есть всегда. Но зачем они там, я не знаю.
Действующие ветки имеют те же имена, что и в разделе Adapters.
Нет адаптера - нет интерфейса.
PM MAIL   Вверх
Sterling
Дата 18.3.2005, 09:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 26.9.2004

Репутация: нет
Всего: нет



Вы наверное меня не правельно поняли. у меня такая ситуация:
По этому пути, HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\Tcpip\Parameters\Interfaces
, у меня есть еще 6 папок ({1CB64B9E-A0DF-47E0-B901-64B473509088}, {2BC6FB07-2753-4120-9FFA-C07A1BC18B22}, {43EC3B44-2C96-4D97-8610-49050CCE79F2}, {45C5AB30-B899-49D4-8A16-CE8F833EDB32}, {95C19F58-C265-489C-8831-257144D1DEC5}, {D0C862C9-906D-469A-A635-0478E68C9DE6}) и только в одной из них в ключе IPAddress указан мой адрес, поэтому то я и в предыдущем коде вписал пусть прямо до этой папки. А если прога будет на другом компе, что тогда. Вот я и хочу узнать что это за папки такие. И второе когда с помощью предыдущего кода я меняю ип, то тип ключа IPAddress становиться reg_sz, а мне надо reg_multi_sz. Как у казать ему этот тип?

PM MAIL   Вверх
Snowy
Дата 18.3.2005, 10:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 53
Всего: 484



Цитата(Sterling @ 18.3.2005, 09:38)
А если прога будет на другом компе, что тогда

Нужно считать список ключей из раздела Adapters - получишь реально действующие ключи.
По полученным номерам, можно обращаться уже к Interfaces.
Можно и сразу обращаться к Interfaces и игнорировать ветки, в которых IPAddress либо отсутствует, либо равен 0.0.0.0


Цитата(Sterling @ 18.3.2005, 09:38)
тип ключа IPAddress становиться reg_sz, а мне надо reg_multi_sz

TRegistry - упрощенный клаз, для более удобной работы с реестром.
Подразумевается его совместимость по структурам и коммандам с TIniFile. Поэтому он не обладает полными возможностями. Он разрабатывался для сохранения своих значений, а не для изменения системных. Поэтому в нем нельзя создать значение типа reg_multi_sz.
Для этого придется работать с реестром через WinAPI.
Читай справку по RegQueryValueEx b и вообще посмотри раздел "Registry Functions" в справочнике WinAPI.
PM MAIL   Вверх
Sterling
Дата 18.3.2005, 11:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 26.9.2004

Репутация: нет
Всего: нет



Вот что получилось с одним но (потчеркнуто):

Код

procedure TForm1.FormShow(Sender: TObject);
var
  Adapters: HKey; 
  Buffer: array[0 .. 1000] of char;
  Err, index: longint;
begin
  err := RegOpenKey(HKEY_local_machine, 'SYSTEM\ControlSet001\Services\Tcpip\parameters\Adapters', Adapters);
  index := 0;
  Err := RegEnumKey(Adapters, index, Buffer, Sizeof(Buffer));
  combobox1.Text := strpas(buffer);
  while err = ERROR_SUCCESS do
  begin
    combobox1.Items.Add(StrPas(Buffer));
    inc(index);
    Err := RegEnumKey(Adapters, index, Buffer, Sizeof(Buffer));
  end;
  RegCloseKey(Adapters);
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  Interfaces: HKey;
  by: //с типом тоже косяк =(;
begin
  by := 'SYSTEM\ControlSet001\Services\Tcpip\parameters\interfaces\' + combobox1.Items;  
{Как тут грамотно сделать, чтобы название адаптера бралось из выбранного комбобоксаили проще брать индекс? Если да то тоже как к нему обратиться?}

  RegOpenKey(HKEY_local_machine, by, Interfaces);
  RegSetValue (Interfaces, reg_multi_sz, strtoint(edit1.Text));// вполне возможно что тут ошибка тоже!
  RegCloseKey(interfaces);
  end;


Это сообщение отредактировал(а) Sterling - 18.3.2005, 12:14
PM MAIL   Вверх
Snowy
Дата 18.3.2005, 14:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 53
Всего: 484



Вот. Программа для изменения IP адресов.
Где-то может коряво, без комментариев и try, но работает.
Работать под 98-ми скорее всего не бедет, но под NT на любой машине должно.
Код

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,  Dialogs, Buttons, StdCtrls;

type
  TForm1 = class(TForm)
    ComboBox1: TComboBox;
    Edit1: TEdit;
    Button1: TButton;
    procedure FormCreate(Sender: TObject);
    procedure ComboBox1Select(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  IList: TStringList;

implementation

{$R *.dfm}

function ReadIP(key:string):string;
const
  ifs='SYSTEM\ControlSet001\Services\Tcpip\Parameters\Interfaces';
var
  reg: HKey;
  DataType, DataSize: DWORD;
  s:   string;
begin
  result:='';
  s:=ifs+'\'+key;
  if RegOpenKeyEx(HKEY_local_machine,PAnsiChar(s),0,KEY_QUERY_VALUE,reg)=ERROR_SUCCESS then
  begin
    RegQueryValueEx(reg,'IPAddress',nil,@DataType,nil,@DataSize);
    SetLength(s, DataSize-1);
    RegQueryValueEx(reg,'IPAddress',nil,@DataType,PByte(@s[1]),@DataSize);
    result:=s;
  end;
  RegCloseKey(reg);
end;

procedure SetIP(key,value:string);
const
  ifs='SYSTEM\ControlSet001\Services\Tcpip\Parameters\Interfaces';
var
  reg: HKey;
begin
  if RegOpenKeyEx(HKEY_LOCAL_MACHINE,PAnsiChar(ifs+'\'+key),0,KEY_SET_VALUE,reg)=ERROR_SUCCESS then
    RegSetValueEx(reg,'IPAddress',0,REG_MULTI_SZ,PAnsiChar(value),Length(value));
  RegCloseKey(reg);
end;

procedure TForm1.FormCreate(Sender: TObject);
const
  nwc='SOFTWARE\Microsoft\Windows NT\CurrentVersion\NetworkCards';
var
  card,reg:  HKey;
  DataType, DataSize: DWORD;
  buf:   array[0 .. 1000] of char;
  index: longint;
  s:     string;
begin
  IList:=TStringList.Create;
  RegOpenKey(HKEY_local_machine, nwc, card);
  index:=0;
  while RegEnumKey(card, index, buf, Sizeof(buf))=ERROR_SUCCESS do
  begin
    if RegOpenKeyEx(card,buf,0,KEY_QUERY_VALUE,reg)=ERROR_SUCCESS then
    begin
      RegQueryValueEx(reg,'Description',nil,@DataType,nil,@DataSize);
      SetLength(s, DataSize-1);
      RegQueryValueEx(reg,'Description',nil,@DataType,PByte(@s[1]),@DataSize);
      ComboBox1.Items.Add(s);
      RegQueryValueEx(reg,'ServiceName',nil,@DataType,nil,@DataSize);
      SetLength(s, DataSize-1);
      RegQueryValueEx(reg,'ServiceName',nil,@DataType,PByte(@s[1]),@DataSize);
      IList.Add(s);
      RegCloseKey(reg);
    end;
    inc(index);
  end;
  RegCloseKey(card);
  With ComboBox1 do if Items.Count>0 then begin
    ItemIndex:=0;
    Edit1.Text:=ReadIP(IList[0]);
  end;
end;

procedure TForm1.ComboBox1Select(Sender: TObject);
begin
  if ComboBox1.Items.Count=0 then Exit;
  Edit1.Text:=ReadIP(IList[ComboBox1.ItemIndex]);
  Button1.Enabled:=true;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  if ComboBox1.Items.Count=0 then Exit;
  SetIP(IList[ComboBox1.itemIndex],Edit1.Text);
  Edit1.Text:=ReadIP(IList[ComboBox1.ItemIndex]);
end;

end.

PM MAIL   Вверх
Sterling
Дата 18.3.2005, 14:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 26.9.2004

Репутация: нет
Всего: нет



А ты с моей мне помочь не можешь? С тем что уже есть.
PM MAIL   Вверх
Snowy
Дата 18.3.2005, 14:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 53
Всего: 484



Так вот - готовое все.
Выдергивай процедуры ReadIP и SetIP.
Они на вход должны получать ключ, типа {95C19F58-C265-489C-8831-257144D1DEC5}.
В формкреате вставь создание списка этих ключей, как в моем коде.
Главное, чтобы индексы комбобокса совпадали с этим списком. Хотя можно придумать что-нить пограмотнее.
Вобщем, в результате работы формкреате, мы имеем комбобокс, заполненный именами сетевых адаптеров, и IList, заполненный соответствующими UID'ами интерфейсов этих адаптеров.
Если не справишься, высылай исходняки мне на почту.
P.S. Только что проверил - под 98-ми действительно не работает.
Под 9х, думаю схема примерно такая же, только инфа в другом месте должна быть.
Где - не знаю, у меня 98-х нет - машина не моя, ковыряться не могу.
PM MAIL   Вверх
Sterling
Дата 26.3.2005, 07:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 26.9.2004

Репутация: нет
Всего: нет



Прикол в том, что нужна перезугрузка компа после использования этого кода. А вот как избежать ее. При использование стандартных стредств виндовс, при смене ипа на хр, перезагрузка не нужна!
PM MAIL   Вверх
<Spawn>
Дата 30.3.2005, 11:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Око кары:)
****


Профиль
Группа: Экс. модератор
Сообщений: 2776
Регистрация: 29.1.2003
Где: Екатеринбург

Репутация: 1
Всего: 64



Это можно осуществить функциями iphlpapi.dll. AddIPAddress - связывает новый адрес с адаптером, DeleteIPAddress соответственно удаляет.

Вот код использования(но есть одно проблемка, которую я пока по неимении свободного времени не решил - у тебя будет выскакивать AV, при наличии указателей в структуре - где то идет чтение\записть в невыделеную память, но думаю ты разберешься или тебе кто нить поможет smile )

Код

const
  MAX_ADAPTER_NAME_LENGTH = 256;
  MAX_ADAPTER_DESCRIPTION_LENGTH = 128;
  MAX_ADAPTER_ADDRESS_LENGTH = 8;

type
  PIP_ADDRESS_STRING = ^IP_ADDRESS_STRING;
  IP_ADDRESS_STRING = array[0..15] of char; // IP as string

  PIP_ADDR_STRING = ^IP_ADDR_STRING;
  IP_ADDR_STRING = record
    Next: PIP_ADDR_STRING;
    IpAddress: IP_ADDRESS_STRING;
    IpMask: IP_ADDRESS_STRING;
    Context: DWORD;
  end;

  PIP_ADAPTER_INFO = ^IP_ADAPTER_INFO;

  IP_ADAPTER_INFO = record
    Next: PIP_ADAPTER_INFO;
    ComboIndex: DWORD;
    AdapterName: array[1..MAX_ADAPTER_NAME_LENGTH + 4] of  char;
    Description: array[1..MAX_ADAPTER_DESCRIPTION_LENGTH + 4] of char;
    AddressLength: UINT;
    Address: array[1..MAX_ADAPTER_ADDRESS_LENGTH] of byte;
    Index: DWORD;
    aType: UINT;
    DHCPEnabled: UINT;
    CurrentIPAddress: PIP_ADDR_STRING;
    IPAddressList: IP_ADDR_STRING;
    GatewayList: IP_ADDR_STRING;
    DHCPServer: IP_ADDR_STRING;
    HaveWINS: BOOL;
    PrimaryWINSServer: IP_ADDR_STRING;
    SecondaryWINSServer: IP_ADDR_STRING;
    LeaseObtained: LongInt;
    LeaseExpires: LongInt;
  end;

  TIpAdapterInfo = IP_ADAPTER_INFO;
  PIpAdapterInfo = PIP_ADAPTER_INFO;

var
  Form1: TForm1;

  function GetAdaptersInfo(AdapterInfo: PIpAdapterInfo; OutBufLen: PLongInt): DWORD; stdcall;
    external 'iphlpapi.dll' name 'GetAdaptersInfo';

  function AddIPAddress(Address, IpMask: LongInt; IfIndex: DWORD;
    NTEContext, NTEInstance: PLongInt): DWORD; stdcall; external 'iphlpapi.dll' name 'AddIPAddress';
  function DeleteIPAddress(NTEContext: LongInt): DWORD; stdcall; external 'iphlpapi.dll' name 'DeleteIPAddress';

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
  Rslt: DWORD;
  Next: PIpAdapterInfo;
  Size: DWORD;
  AdapterInfo: TIPAdapterInfo;
  NTEContext, NTEInstance: LongInt;
  IP: PIP_ADDR_STRING;
begin
  Size := 0;
  //Определяем требуемый размер
  GetAdaptersInfo(@AdapterInfo, @Size);
  //Получаем интересующие данные
  Rslt := GetAdaptersInfo(@AdapterInfo, @Size);
  if Rslt = 0 then
  begin
    Next := @AdapterInfo;
    repeat
      { Так можно удалять IP-шники
      IP := @Next.IPAddressList;
      repeat
        if AnsiCompareText(IP.IpAddress, '212.23.87.100') = 0 then
        begin
          DeleteIPAddress(IP.Context);
          Break;
        end;
        IP := IP.Next;
      until not Assigned(IP); }
      //Добавляем новый IP к адаптеру
      Rslt := AddIpAddress(inet_addr('212.23.87.100'), inet_addr('255.255.255.224'), Next.Index, @NTEContext, @NTEInstance);
      if Rslt <> NO_ERROR then
        ShowMessage(SysErrorMessage(Rslt));
      Next := Next^.Next;
    until not Assigned(Next);
  end
  else
    ShowMessage(SysErrorMessage(Rslt));
end;

Добавлено @ 11:53
Не забудь подключить WinSock для использования функции inet_addr

Это сообщение отредактировал(а) <Spawn> - 30.3.2005, 11:52


--------------------
"Для некоторых людей программирование является такой же внутренней потребностью, подобно тому, как коровы дают молоко, или писатели стремятся писать" - Николай Безруков.
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Сети"
Snowy
Poseidon
MetalFan

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делится вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Snowy, Poseidon, MetalFan.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Сети | Следующая тема »


 




[ Время генерации скрипта: 0.0601 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.