Форум: "Сети";
Текущий архив: 2006.06.25;
Скачать: [xml.tar.bz2];
ВнизИзменить основной шлюз, альтерн. и предпочит ДНС в виндовсе Найти похожие ветки
← →
DelphiN! © (2006-02-06 09:18) [0]Как изменить САБЖ, и применить изменения сразу, без перезагрузки. Сам ксожадению данную информацию найти не смог :(
← →
Rouse_ © (2006-02-06 09:43) [1]Очень просто. Есть такая недокументированная функция в 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 - поэксперементируй.
← →
DelphiN! © (2006-02-06 11:57) [2]
> [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;
← →
DelphiN! © (2006-02-06 12:22) [3]SetAdapterIpAddress возвращает 68
← →
Rouse_ © (2006-02-06 13:19) [4]DHCP клиент должен быть включен в службах, ну и текущай IP третим параметром тоже передай попробуй.
← →
piople © (2006-02-06 13:33) [5]А как при этом еще заменить DNS? и альтернативный DNS?
← →
DelphiN! © (2006-02-06 13:41) [6]DHCP клиент включен, ИП адрес тоже ставить пробовал, результат тотже :(
← →
DelphiN! © (2006-02-06 13:50) [7]В кодах ошибок Windows код 68 соответствует ошибке "Превышен предел по числу имен для локальной сетевой платы компьютера".
Что это значит?
← →
Rouse_ © (2006-02-06 14:41) [8]Тэкс, попробуй передать ГУИД просто строкой... Он у тебя должен быть известен:
Вот тут еще посмотри: http://rsdn.ru/Forum/Message.aspx?mid=511834
← →
DelphiN! © (2006-02-06 15:08) [9]
> [8] Rouse_ © (06.02.06 14:41)
Переустановил драйвера на сетевую карту и все заработало! Странно, а локальная сеть у меня работала без проблемм ... Теперь осталось изменить предпочитаемый и альтернативный ДНС сервер.
Может кто знает как сделать и это?
← →
DelphiN! © (2006-02-08 14:51) [10]Функция SetAdapterIpAddress не работает, если на компьютере прописано несколько IP адресов!
← →
DelphiN! © (2006-02-08 14:51) [11]Возвращает код 68
← →
piople © (2006-02-14 05:30) [12]Что значит - "прописано несколько IP адресов" несколько сетевых карт в машине?
← →
Rouse_ © (2006-02-14 22:43) [13]
> Что значит - "прописано несколько IP адресов" несколько
> сетевых карт в машине?
за каждой сетевой картой может быть закреплено несколько IP адесов. Добавляются через свойства сетевого подключения...
Матчасть однако... ;)
← →
Kuzia (2006-02-15 15:31) [14]Нужна аналогичная функция для Win98 (в ип хелпере 98 - SetAdapterIpAddress нет). Собственно даже нужен только способ включить DHCP для определенного интерфейса.
Страницы: 1 вся ветка
Форум: "Сети";
Текущий архив: 2006.06.25;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.01 c