Локальная Сеть!

24.05.2008
8
0
#1
Как сделать на делфи так, чтобы по нажатию кнопки (button), Настройки сети были такие: получить IP - адрес автоматически, и DNS - сервер автоматически???
Windows 7 или XP...
?????
 

sinkopa

Well-known member
17.06.2009
344
4
#2
Как сделать на делфи так, чтобы по нажатию кнопки (button), Настройки сети были такие: получить IP - адрес автоматически, и DNS - сервер автоматически???
(1) Получить информацию о всех сетевых соединениях на компьтере
(2) Выбрать нужное соединение и сбросить настройки (ну или в цикле сбросить все)... :huh:
Если чтобы "сильно не заморачиваться", можно это сделать через консольные команды Windows.
В этом случае, думаю netsh.exe - то что Вам нужно. Справку читайте тут например Настройка сети в Windows из командной строки
Чтобы выполнять в Delphi консольные команды, можете востользоваться например вот этим модулем
Код:
unit uConsole;

interface
uses
SysUtils, Classes, Windows;

procedure GetConsoleOutput (const CommandLine : string; var Output : TStringList);

implementation

procedure GetConsoleOutput (const CommandLine : string; var Output : TStringList);
var
SA: TSecurityAttributes;
SI: TStartupInfo;
PI: TProcessInformation;
StdOutFile, AppProcess, AppThread : THandle;
RootDir, WorkDir, StdOutFileName:string;
const
FUNC_NAME = 'GetConsoleOuput';
begin
StdOutFile:=0;
AppProcess:=0;
AppThread:=0;
try
// Initialize dirs
RootDir := ExtractFilePath(ParamStr(0));
WorkDir := RootDir;

// Initialize output file security attributes
FillChar(SA,SizeOf(SA),#0);
SA.nLength:=SizeOf(SA);
SA.lpSecurityDescriptor:=nil;
SA.bInheritHandle:=True;

// Create Output File
StdOutFileName := RootDir+'output.tmp';
StdOutFile := CreateFile(PChar(StdOutFileName),
GENERIC_READ or GENERIC_WRITE,
FILE_SHARE_READ or FILE_SHARE_WRITE,
@SA,
CREATE_ALWAYS, // Always create it
FILE_ATTRIBUTE_TEMPORARY or // Will cache in memory
// if possible
FILE_FLAG_WRITE_THROUGH,
0);

// Check Output Handle
if StdOutFile = INVALID_HANDLE_VALUE then
raise Exception.CreateFmt('Function %s() failed!' + #10#13 +
'Command line = %s',[FUNC_NAME,CommandLine]);

// Initialize Startup Info
FillChar(SI,SizeOf(SI),#0);
with SI do
begin
cb:=SizeOf(SI);
dwFlags:=STARTF_USESHOWWINDOW or STARTF_USESTDHANDLES;
wShowWindow:=SW_HIDE;
hStdInput:=GetStdHandle(STD_INPUT_HANDLE);
hStdError := StdOutFile;
hStdOutput:= StdOutFile;
end;

// Create the process
if CreateProcess(nil, PChar(CommandLine), nil, nil, True, 0, nil, PChar(WorkDir), SI, PI) then
begin
WaitForSingleObject(PI.hProcess,INFINITE);
AppProcess:=PI.hProcess;
AppThread:=PI.hThread;
end
else
raise Exception.CreateFmt('CreateProcess() in function %s() failed!'
+ #10#13 + 'Command line = %s',[FUNC_NAME,CommandLine]);

CloseHandle(StdOutFile);
StdOutFile:=0;

Output.Clear;
Output.LoadFromFile (StdOutFileName);
// Clean Console output
Output.Text := StringReplace(Output.Text,#13#10#13#10,#13#10,[rfReplaceAll, rfIgnoreCase]);
finally
// Close handles
if StdOutFile <> 0 then CloseHandle(StdOutFile);
if AppProcess <> 0 then CloseHandle(AppProcess);
if AppThread <> 0 then CloseHandle(AppThread);

// Delete Output file
if FileExists(StdOutFileName) then
SysUtils.DeleteFile(StdOutFileName);
end;
end;

end.
Использовать (для вашей задачи) так
Код:
uses uConsole;

{$R *.dfm}

function FindAdapters(from: TStrings; target: TStrings): Boolean;
var
i,n: Integer;
s: string;
begin
target.Clear;
for i := 0 to from.Count-1 do
begin
s := Trim(from[i]);
//set address name="VMware Network Adapter VMnet8" source=static addr=192.168.48.1 mask=255.255.255.0
if (Length(s) < 18) or (Pos('set address name',s) <> 1) then Continue;

n := Pos('"',s);
if (n < 1) then Continue;

s := Copy(s,n+1,Length(s));

n := Pos('"',s);
if (n < 1) then Continue;

s := Copy(s,1, n-1);

if (Length(s) > 1) then
begin
target.Add(s)
end;
end;

Result := (target.Count > 0);

end;

{ Получить в ComboBox1 имена сетевых соединений }
procedure TForm1.Button1Click(Sender: TObject);
var
l: TStringList;
i: Integer;
begin
ComboBox1.Clear;
l := TStringList.Create;
GetConsoleOutput('netsh -c interface dump',l);
Memo1.Lines.Text := l.Text;

if not FindAdapters(l,ComboBox1.Items) then
begin
ShowMessage('Не нашлось сетевых соединений!');
end
else
ComboBox1.ItemIndex := 0;
l.Free;
end;

{ Вывести в Memo1 текущие настройки сети }
procedure TForm1.Button2Click(Sender: TObject);
var
l: TStringList;
begin
Memo1.Clear;
l := TStringList.Create;
GetConsoleOutput('ipconfig -all',l);
Memo1.Lines.Text := l.Text;
l.Free;
end;

{ автоматический сброс сетевых настроек для выбранного адаптера}
procedure TForm1.Button3Click(Sender: TObject);
var
adapter, command: string;
l: TStringList;
begin
Memo1.Clear;
if (ComboBox1.ItemIndex < 0) then Exit;
l := TStringList.Create;

adapter := ComboBox1.Items[ComboBox1.ItemIndex];

{IP - получать автоматически }
command := 'netsh interface ip set address "'+adapter+'" dhcp';

GetConsoleOutput(command,l);
Memo1.Lines.Text := l.Text;

{DNS - получать автоматически }
command := 'netsh interface ip set dns "'+adapter+'" dhcp';
GetConsoleOutput(command,l);
Memo1.Lines.AddStrings(l);

l.Free;
end;
Вот (если надо) тестовый проект Посмотреть вложение Test.rar

Если же Вы хотите "заморочиться по полной" (через WinAPI например), то советую посмотреть в сторону библиотеки jedi-apilib
Живет тутhttp://jedi-apilib.sourceforge.net
 

Вложения

  • 4.1 КБ Просмотры: 49