Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Изменить основной шлюз, альтерн. и предпочит ДНС в виндовсе [WinXP]


DelphiN! ©   (2006-02-06 09:18:00) 

Как изменить САБЖ, и применить изменения сразу, без перезагрузки. Сам ксожадению данную информацию найти не смог :(


Kuzia   (2006-02-15 15:31:00) [1]

Нужна аналогичная функция для Win98 (в ип хелпере 98 - SetAdapterIpAddress нет). Собственно даже нужен только способ включить DHCP для определенного интерфейса.


Rouse_   (2006-02-14 22:43:00) [2]


> Что значит - "прописано несколько IP адресов" несколько
> сетевых карт в машине?

за каждой сетевой картой может быть закреплено несколько IP адесов. Добавляются через свойства сетевого подключения...
Матчасть однако... ;)


piople   (2006-02-14 05:30:00) [3]

Что значит - "прописано несколько IP адресов" несколько сетевых карт в машине?


DelphiN!   (2006-02-08 14:51:00) [4]

Функция SetAdapterIpAddress не работает, если на компьютере прописано несколько IP адресов!


DelphiN!   (2006-02-08 14:51:00) [5]

Возвращает код 68


DelphiN!   (2006-02-06 15:08:00) [6]


>  [8] Rouse_ ©   (06.02.06 14:41)


Переустановил драйвера на сетевую карту и все заработало! Странно, а локальная сеть у меня работала без проблемм ... Теперь осталось изменить предпочитаемый и альтернативный ДНС сервер.
Может кто знает как сделать и это?


Rouse_   (2006-02-06 14:41:00) [7]

Тэкс, попробуй передать ГУИД просто строкой... Он у тебя должен быть известен:

Вот тут еще посмотри: http://rsdn.ru/Forum/Message.aspx?mid=511834


DelphiN!   (2006-02-06 13:50:00) [8]

В кодах ошибок Windows код 68 соответствует ошибке "Превышен предел по числу имен для локальной сетевой платы компьютера".
Что это значит?


DelphiN!   (2006-02-06 13:41:00) [9]

DHCP клиент включен, ИП адрес тоже ставить пробовал, результат тотже :(


piople   (2006-02-06 13:33:00) [10]

А как при этом еще заменить DNS? и альтернативный DNS?


Rouse_   (2006-02-06 13:19:00) [11]

DHCP клиент должен быть включен в службах, ну и текущай IP третим параметром тоже передай попробуй.


DelphiN!   (2006-02-06 12:22:00) [12]

SetAdapterIpAddress возвращает 68


DelphiN!   (2006-02-06 11:57:00) [13]


>  [1] Rouse_ ©   (06.02.06 09:43)


Спасибо, попробовал, но к сожадению адреса по каким-то причинам не меняются, вот как я это сделал :


const
 MAX_ADAPTER_NAME_LENGTH        = 256;
 MAX_ADAPTER_DESCRIPTION_LENGTH = 128;
 MAX_ADAPTER_ADDRESS_LENGTH     = 8;
 IPHelper = 'iphlpapi.dll';

 MIB_IF_TYPE_OTHER     = 1;
 MIB_IF_TYPE_ETHERNET  = 6;
 MIB_IF_TYPE_TOKENRING = 9;
 MIB_IF_TYPE_FDDI      = 15;
 MIB_IF_TYPE_PPP       = 23;
 MIB_IF_TYPE_LOOPBACK  = 24;
 MIB_IF_TYPE_SLIP      = 28;

type
 time_t = Longint;

 IP_ADDRESS_STRING = record
   S: array [0..15] of Char;
 end;
 IP_MASK_STRING = IP_ADDRESS_STRING;
 PIP_MASK_STRING = ^IP_MASK_STRING;

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

 PIP_ADAPTER_INFO = ^IP_ADAPTER_INFO;
 IP_ADAPTER_INFO = record
   Next: PIP_ADAPTER_INFO;
   ComboIndex: DWORD;
   AdapterName: array [0..MAX_ADAPTER_NAME_LENGTH + 3] of Char;
   Description: array [0..MAX_ADAPTER_DESCRIPTION_LENGTH + 3] of Char;
   AddressLength: UINT;
   Address: array [0..MAX_ADAPTER_ADDRESS_LENGTH - 1] of BYTE;
   Index: DWORD;
   Type_: 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: time_t;
   LeaseExpires: time_t;
 end;

type
 TForm1 = class(TForm)
   Memo1: TMemo;
   procedure FormCreate(Sender: TObject);
   function GetAdapterGUID: String;
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 Form1: TForm1;

implementation

 function SetAdapterIpAddress(szAdapterGUID: PChar; dwDHCP, dwIP, dwMask, dwGateway: DWORD): DWORD; stdcall; external 'iphlpapi.dll';

 function GetAdaptersInfo(pAdapterInfo: PIP_ADAPTER_INFO;
   var pOutBufLen: ULONG): DWORD; stdcall; external IPHelper;
{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
var
 InterfaceInfo,
 TmpPointer: PIP_ADAPTER_INFO;
 Len: Cardinal;
 strl: TStringList;
begin
 try
   strl := TStringList.Create;
   strl.Text := GetAdapterGUID;
   if strl.Count > 0 then
     SetAdapterIpAddress(PChar(strl.Strings[0]),0,0,inet_addr('255.255.255.0'),inet_addr('198.162.0.147'));
 finally
   strl.Free;
 end;
end;

function TForm1.GetAdapterGUID: String;
var
 InterfaceInfo,
 TmpPointer: PIP_ADAPTER_INFO;
 IP: PIP_ADDR_STRING;
 Len: ULONG;
 AdapterType: String;
begin
 if GetAdaptersInfo(nil, Len) = ERROR_BUFFER_OVERFLOW then
 begin
   GetMem(InterfaceInfo, Len);
   try
     if GetAdaptersInfo(InterfaceInfo, Len) = ERROR_SUCCESS then
     begin
       TmpPointer := InterfaceInfo;
       repeat
         if Result <> '' then
           Result := Result+#13#10;
         Result := Result+TmpPointer^.AdapterName;
         TmpPointer := TmpPointer.Next;
       until TmpPointer = nil;
     end;
   finally
     FreeMem(InterfaceInfo);
   end;
 end;
end;


Rouse_   (2006-02-06 09:43:00) [14]

Очень просто. Есть такая недокументированная функция в iphlpapi.dll
Выглядит она так:

function SetAdapterIpAddress(szAdapterGUID: PChar; dwDHCP, dwIP, dwMask, dwGateway: DWORD): DWORD; stdcall; external 'iphlpapi.dll';

Первый параметр - ГУИД сетевого интерфейса. найти его ты можешь через GetAdaptersInfo. Пример здесь: http://rouse.front.ru/netifenum.zip

дальше идут адрес DHCP сервера, IP адрес и маска подсети которые ты хочешь установить и последним параметром идет шлюз.

Если какойто из параметров менять не хочешь - передавай ноль, если будешь менять, то передавай через inet_addr, к примеру inet_addr('192.168.1.2')

По поводу первого параметра, я не помню, там либо PChar либо PWideChar - поэксперементируй.


Наверх

Титульная страница Поиск, карта сайта Написать письмо