O problema: mudar o endereço IP de uma placa de rede sem reiniciar o PC. Para isso utilize a Listagem 1.


1   function CriaProcesso(comando: string):integer;
2   var
3     zAppName: array[0..512] of char;
4     zCurDir: array[0..255] of char;
5     WorkDir: string;
6     StartupInfo: TStartupInfo;
7     ProcessInfo: TProcessInformation;
8     Resultado: DWord;
9   begin
10    StrPCopy(zAppName, comando);
11    GetDir(0, WorkDir);
12    StrPCopy(zCurDir, WorkDir);
13    FillChar(StartupInfo, Sizeof(StartupInfo), #0);
14    StartupInfo.cb := Sizeof(StartupInfo);
15    StartupInfo.dwFlags := STARTF_USESHOWWINDOW;
16    StartupInfo.wShowWindow := sw_hide;
17   
18    if not CreateProcess(nil, zAppName, nil, nil, false, 
    CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS, nil, nil, StartupInfo, ProcessInfo) then
19      Result := -1 { ponteiro para o PROCESS_INF }
20    else
21    begin
22      WaitforSingleObject(ProcessInfo.hProcess, INFINITE);
23      GetExitCodeProcess(ProcessInfo.hProcess,Resultado);
24      Result := Resultado;
25    end;
26  end;
27   
28  function DefinirIP(NomeConexao, Ip, Netmask, Gateway: string):boolean;
29  begin
30    Result:=( CriaProcesso(Format('netsh int ip set address name="%s" 
    source=static %s %s %s 1',[ NomeConexao, Ip, NetMask, Gateway]))=0 );
31  end;
32   
33   
34  function FixarDNS(NomeConexao: String; ipDNS: string): boolean;
35  begin
36    Result:=( CriaProcesso(Format('netsh int ip set dns "%s" static %s',
   [NomeConexao, ipDNS]))=0 );
37  end;
38   
39  procedure TForm1.Button1Click(Sender: TObject);
40  begin
41    if NOT DefinirIP( 'Conexão de Rede sem Fio', '192.168.25.126', '255.255.255.0', 
    '192.168.25.1') then
42      ShowMessage('Erro na alteração do IP')
43    else
44      ShowMessage('IP alterado sem erros');
45  end;
46   
47  procedure TForm1.Button2Click(Sender: TObject);
48  begin
49    if NOT FixarDNS( 'Conexão de Rede sem Fio', '192.168.25.1') then
50      ShowMessage('Erro na Fixação do DNS')
51    else
52      ShowMessage('DNS alterado sem erros');
53  end;
Listagem 1. Exemplo de uso de Unicode String em showmessages
  • Linha 1 à 26: Método para criar um processo do Windows e executar comandos através de Strings, similar ao que se faz no Prompt do DOS.
  • Linha 28 e 31: Método que monta uma String para definir o IP do Windows:
    • Parâmetro 1: Nome do adaptador de Rede definido no Windows;
    • Parâmetro 2: IP que será definido;
    • Parâmetro 3: Máscara da rede;
    • Parâmetro 4: Número do Gateway que será definido para o adaptador;
  • Linha 34 à 37: Método que monta uma String para definir um DNS:
    • Parâmetro 1: Nome do adaptador de Rede definido no Windows;
    • Parâmetro 2: Valor do DNS;
  • Linha 39 a 45: Implementação do Evento OnClick do Button1 chamando o método DefinirIP passando os valores de exemplo;
  • Linha 47 a 53: Implementação do Evento OnClick do Button2 chamando o método FixarDNS passando os valores de exemplo.