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

Тема в разделе "Delphi - Сети", создана пользователем Experimentator, 19 ноя 2012.

  1. Experimentator

    Регистрация:
    24 май 2008
    Сообщения:
    8
    Симпатии:
    0
    Как сделать на делфи так, чтобы по нажатию кнопки (button), Настройки сети были такие: получить IP - адрес автоматически, и DNS - сервер автоматически???
    Windows 7 или XP...
    ?????
     
  2. sinkopa

    sinkopa Well-Known Member

    Регистрация:
    17 июн 2009
    Сообщения:
    344
    Симпатии:
    9
    (1) Получить информацию о всех сетевых соединениях на компьтере
    (2) Выбрать нужное соединение и сбросить настройки (ну или в цикле сбросить все)... :huh:
    Если чтобы "сильно не заморачиваться", можно это сделать через консольные команды Windows.
    В этом случае, думаю netsh.exe - то что Вам нужно. Справку читайте тут например Настройка сети в Windows из командной строки
    Чтобы выполнять в Delphi консольные команды, можете востользоваться например вот этим модулем
    Код (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.
    Использовать (для вашей задачи) так
    Код (Delphi):
    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
     
  3. Experimentator

    Регистрация:
    24 май 2008
    Сообщения:
    8
    Симпатии:
    0
    Спасибо огромное, сейчас проверю!!! :huh:
     
Загрузка...

Поделиться этой страницей