![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Изменить основной шлюз, альтерн. и предпочит ДНС в виндовсе [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 - поэксперементируй.