Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Сети > IP адреса локальных машин


Автор: sharnir 2.4.2006, 15:50
Не могу разобраться как определяются ip адресса комп-ов локальной сети!!!
Недавно находил UNIT
Код

unit FindComp;

interface 

uses 
  Windows, Classes; 

function FindComputers: DWORD;

var 
  Computers: TStringList; 

implementation 

uses 
  SysUtils; 

const 
  MaxEntries = 250; 

function FindComputers: DWORD; 

var 
  EnumWorkGroupHandle, EnumComputerHandle: THandle; 
  EnumError: DWORD; 
  Network: TNetResource; 
  WorkGroupEntries, ComputerEntries: DWORD; 
  EnumWorkGroupBuffer, EnumComputerBuffer: array[1..MaxEntries] of TNetResource; 
  EnumBufferLength: DWORD; 
  I, J: DWORD; 

begin 

  Computers.Clear; 

  FillChar(Network, SizeOf(Network), 0); 
  with Network do 
  begin 
    dwScope := RESOURCE_GLOBALNET; 
    dwType := RESOURCETYPE_ANY; 
    dwUsage := RESOURCEUSAGE_CONTAINER; 
  end; 
   
  EnumError := WNetOpenEnum(RESOURCE_GLOBALNET, RESOURCETYPE_ANY, 0, @Network, EnumWorkGroupHandle); 

  if EnumError = NO_ERROR then 
  begin 
    WorkGroupEntries := MaxEntries; 
    EnumBufferLength := SizeOf(EnumWorkGroupBuffer); 
    EnumError := WNetEnumResource(EnumWorkGroupHandle, WorkGroupEntries, @EnumWorkGroupBuffer, EnumBufferLength); 

    if EnumError = NO_ERROR then 
    begin 
      for I := 1 to WorkGroupEntries do 
      begin 
        EnumError := WNetOpenEnum(RESOURCE_GLOBALNET, RESOURCETYPE_ANY, 0, @EnumWorkGroupBuffer[I], EnumComputerHandle); 
        if EnumError = NO_ERROR then 
        begin 
          ComputerEntries := MaxEntries; 
          EnumBufferLength := SizeOf(EnumComputerBuffer); 
          EnumError := WNetEnumResource(EnumComputerHandle, ComputerEntries, @EnumComputerBuffer, EnumBufferLength); 
          if EnumError = NO_ERROR then 
            for J := 1 to ComputerEntries do 
              Computers.Add(Copy(EnumComputerBuffer[J].lpRemoteName, 3, Length(EnumComputerBuffer[J].lpRemoteName) - 2)); 
          WNetCloseEnum(EnumComputerHandle); 
        end; 
      end; 
    end; 
    WNetCloseEnum(EnumWorkGroupHandle); 
  end; 

  if EnumError = ERROR_NO_MORE_ITEMS then 
    EnumError := NO_ERROR; 
  Result := EnumError; 

end; 

initialization 

  Computers := TStringList.Create; 

finalization 

  Computers.Free; 

end.


Данный пример находит в сети всего 1 комп "НОМЕ", Хотя в сети компов не мение 35!!!
smile smile smile

Автор: Демо 2.4.2006, 16:09
См. здесь: http://rouse.front.ru/

Автор: Poseidon 2.4.2006, 16:31
Код

var  
  Computer: array[1..500] of string[25];  
  ComputerCount: Integer;  

procedure FindAllComputers(Workgroup: string);  
var  
  EnumHandle: THandle;  
  WorkgroupRS: TNetResource;  
  Buf: array[1..500] of TNetResource;  
  BufSize: Integer;  
  Entries: Integer;  
  Result: Integer;  
begin  
  ComputerCount := 0;  
  Workgroup := Workgroup + #0;  
  FillChar(WorkgroupRS, SizeOf(WorkgroupRS), 0);  
  with WorkgroupRS do  
    begin  
      dwScope := 2;  
      dwType := 3;  
      dwDisplayType := 1;  
      dwUsage := 2;  
      lpRemoteName := @Workgroup[1];  
    end;  
  WNetOpenEnum(RESOURCE_GLOBALNET,  
    RESOURCETYPE_ANY,  
    0,  
    @WorkgroupRS,  
    EnumHandle);  
  repeat  
    Entries := 1;  
    BufSize := SizeOf(Buf);  
    Result :=  
      WNetEnumResource(EnumHandle,  
      Entries,  
      @Buf,  
      BufSize);  
    if (Result = NO_ERROR) and (Entries = 1) then  
      begin  
        Inc(ComputerCount);  
        Computer[ComputerCount] := StrPas(Buf[1].lpRemoteName);  
      end;  
  until (Entries <> 1) or (Result <> NO_ERROR);  
  WNetCloseEnum(EnumHandle);  
end; { Find All Computers } 


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