Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > Изменение IP адреса


Автор: Bima 17.8.2006, 09:35
Недавно наткнулся на топик в котором сказано, как поменять IP адрес через реестр, сделал программу, но у этой программы есть только один минус: что бы изменения вступили в силу нужно перезагрузится!!!
Хотя если я меняю через свойства IP протокола свой IP адрес, то изменения вступают сразу.
Думаю, что дело не только в реестре, а в фунциях, которые меняют эти параметры сразу.
Может кто встречал такую проблему???

Автор: dumb 17.8.2006, 11:18
http://forum.vingrad.ru/index.php?showtopic=107950#entry822652 smile

Автор: Bima 17.8.2006, 11:27
Цитата

ЧИТАТЬ ЗДЕСЬ! 


Уважаемый dumb. Эту тему, на которую вы даете мне ссылку, я сам создавал!!! В ней я пытался разобраться как написать программу, которая правит реестр. Но тем неменее проблема остается, так как все равно нужна перезагрузка, а мне нужно сразу поменять IP.

Автор: dumb 17.8.2006, 11:41
да екарный бабай!

текст моего поста прочти внимательно хотя бы один раз и нажми на ссылку.
обратить особое внимание на ссылку после фразы "и вообще"...

user posted image

Автор: Bima 17.8.2006, 13:01
Пордон, не увидел (прошу прощения)
блин, там столько функций

Автор: Bima 18.8.2006, 13:02
C IP адресом разобрался, теперь вопрос другой, можно ли программно поменять HostName и ComputerName. Через реестр знаю как, но думаю, что там такая же проблем, как и с IP. в IPHelper не нашел smile

Автор: dumb 18.8.2006, 13:38
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/sysinfo/base/computer_names.asp

Добавлено @ 13:39 
обратить внимание на
Цитата

Name changes do not take effect until the user restarts the computer.

Автор: Bima 18.8.2006, 14:21
Вот мой код:
Код

ValA=ECN->Text;
sprintf(Value,"%s\0",ValA.c_str());
SetComputerNameEx(ComputerNamePhysicalNetBIOS,Value);

да, имя компа меняется, также можно использовать вместо последней строки, сточку:
Код

/SetComputerNameEx(ComputerNameNetBIOS,Value);

А, еще такой эффект дает вот такой код:
Код

if (Reg->OpenKey("SYSTEM\\CurrentControlSet\\Control\\ComputerName\\ComputerName",false))
   {
   Reg->WriteString("ComputerName", ECN->Text);
   Reg->CloseKey();
   }


так с ComputerName разобрался, а как быть HostName???
если его править в реестре кодом, типа:
Код

if (Reg->OpenKey("SYSTEM\\CurrentControlSet\\Services\\TcpIp\\Parameters",false))
   {
   Reg->WriteString("HostName", EHN->Text);
   Reg->CloseKey();
   }

то компьютер начинает пинговаться по этому адресу, но после загрузки ничего не остается smile

Автор: HappyLife 18.8.2006, 14:25
Нач нужно менять не только здесь. По видимому он восстанавливает значения из другого ключа реестра.

Автор: Bima 18.8.2006, 14:34
сходу вопрос...
С КАКОГО????

и что неужели API функций нету???

Автор: Romikgy 18.8.2006, 15:03
regmon те в руки 

Автор: Bima 18.8.2006, 15:07
слишком многопроцессов общаются с реестром, не отслежу.
К тому же реестр это не выход, на мой взгляд, ведь винда скорее всего правит API функциями, а реестр, потом правит, хотя даже в ней нужна перезагрузка, для смены имени

Автор: dumb 18.8.2006, 15:18
странно. мне показалось что-ли... я вроде привел цитату из мсдна относительно перезагрузки?..

короче. по идее, все эти имена должны быть одинаковыми, а то есть у меня подозрение, что ты их разными делаешь. а логика "восстановления" Hostname такая - процесс winlogon'а просто копирует туда значение из "NV hostname", который, в свою очередь, устанавливается функцией SetComputerNameEx.
так что чтобы было все ажурно нужно вызывать SetComputerNameEx, а потом прописывать в реестр Hostname(такой же, как и при вызове SetComputerNameEx).

Автор: Bima 18.8.2006, 15:56
А вот нифига не получается!!!

вот мой код:
Код

AnsiString ValA;
char Value[256];

ValA=ECN->Text;
sprintf(Value,"%s\0",ValA.c_str());
SetComputerNameEx(ComputerNameNetBIOS,Value);
if (Reg->OpenKey("SYSTEM\\CurrentControlSet\\Control\\ComputerName\\ComputerName",false))
   {
   Reg->WriteString("ComputerName", ECN->Text);
   Reg->CloseKey();
   }
if (Reg->OpenKey("SYSTEM\\CurrentControlSet\\Services\\TcpIp\\Parameters",false))
   {
   Reg->WriteString("HostName", EHN->Text);
   Reg->CloseKey();
   }
Opros();
Application->MessageBox("Ok","Information",MB_ICONINFORMATION);


Там нетрудно заметить, есть два поля. В них я ввожу одинаковые значения.
После выполнения кода, и ПЕРЕЗАГРУЗКИ компьютера ничего не происходит, то есть ComputerName меняется, как и раньше (хотя оно меняется и до перезагрузки), а вот HostName, как до, так и после перезагрузки не меняется.
Есть одна закономерность.... если менять HostName то комп пингуется по этому имени только до перезагрузки, а вот если менять ComputerName, то комп пингуется по этому имени после перезагрузки.

Автор: dumb 18.8.2006, 16:15
тьпу. увидел у тебя косяк, но забыл написать...

причем предыдущий код
Код

SetComputerNameEx(ComputerNamePhysicalNetBIOS,Value);

был более правильным - он хоть работал.

а это:
Код

SetComputerNameEx(ComputerNameNetBIOS,Value);

ничего не делает и просто выпадает с ошибкой.

описание внимательней читай:
SetComputerNameEx принимает только три варианта - ComputerNamePhysicalDnsDomain, ComputerNamePhysicalDnsHostname, ComputerNamePhysicalNetBIOS

вобщем:
Код

SetComputerNameEx(ComputerNamePhysicalDnsHostname, LowerCase(ECN->Text).c_str());
if (Reg->OpenKey("SYSTEM\\CurrentControlSet\\Services\\TcpIp\\Parameters",false))
   {
   Reg->WriteString("HostName", LowerCase(ECN->Text));
   Reg->CloseKey();
   }
Opros();
Application->MessageBox("Ok","Information",MB_ICONINFORMATION);


и еще раз повторю - имя должно быть одинаковое!

Автор: Bima 21.8.2006, 09:39
А зачем нужно преобразовывать имя компьютера в нижней регистр символов???
Дело в том, что при таком коде, выходит, что ComputerName у меня отображается большими буквами, а HostName маленькими, хотя к ним обоим применен оператор LowerCase.
И имена я писал одинаковые, например Comp1

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)