Ver Mensaje Individual
  #5  
Antiguo 05-10-2008
Avatar de cHackAll
[cHackAll] cHackAll is offline
Baneado?
 
Registrado: oct 2006
Posts: 2.159
Reputación: 20
cHackAll Va por buen camino
Código Delphi [-]
// Actualización al truco...

uses WinSock;

//...

function EnumHosts(const lpWorkgroup: PChar = nil; const lpNetResource: PNetResource = nil; const Level: Cardinal = 0): TStrings;
var
 hEnum, Buffer, Count, Size: Cardinal;
 HostEntry: PHostEnt;
 Item: PNetResource;
 List: TStrings;
label TryAgain;
begin
 Result := nil;
 if WNetOpenEnum(RESOURCE_GLOBALNET, RESOURCETYPE_ANY, RESOURCEUSAGE_ALL, lpNetResource, hEnum) = 0 then
  begin
   Size := 16 * 1024;
   Count := $FFFFFFFF;
   TryAgain: Buffer := LocalAlloc(LMEM_ZEROINIT, Size);
   if WNetEnumResource(hEnum, Count, Ptr(buffer), Size) = ERROR_MORE_DATA then
    begin
     LocalFree(Buffer);
     goto TryAgain;
    end;
   Item := Ptr(Buffer);
   Result := TStringList.Create;
   while LongBool(Count) do
    begin
     if Level < 2 then
      begin
       if (Level <> 1) or not Assigned(lpWorkgroup) or (lstrcmpi(lpWorkgroup, Item.lpRemoteName) = 0) then
        begin
         List := EnumHosts(lpWorkgroup, Item, Level + 1);
         if Assigned(List) then
          begin
           Result.AddStrings(List);
           List.Destroy;
          end;
        end;
      end
     else
      begin
       HostEntry := gethostbyname(@Item.lpRemoteName[2]); // deprecated (NetBIOS), also need WinSock.WSAStartup!
       if Assigned(HostEntry) then
        Result.Add(inet_ntoa(PInAddr(HostEntry.h_addr^)^))
       else
        Result.Add(Item.lpRemoteName);
      end;
     Dec(Count);
     Inc(Item);
    end;
   LocalFree(Buffer);
   WNetCloseEnum(hEnum);
  end;
end;

//...

procedure TForm1.FormCreate(Sender: TObject);
var WSData: WSAData;
begin
 WSAStartup($0101, WSData); // ... WSACleanup;
end;//

Uso:

Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
begin
 ListBox1.Items := EnumHosts;
end;

ó

Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
begin
 ListBox1.Items := EnumHosts(Edit1.Text);
end;

ó

Código Delphi [-]
function NetWkstaGetInfo(server: PWideChar; level: Cardinal; buffer: Pointer): Cardinal; stdcall external 'netapi32';

type
 TWkstaInfo100 = record
  wki100_platform_id: Cardinal;
  wki100_computername,
  wki100_langroup: PWideChar;
  wki100_ver_major,
  wki100_ver_minor: Cardinal;
 end;

procedure TForm1.Button2Click(Sender: TObject);
var Info: ^TWkstaInfo100;
begin
 if (NetWkstaGetInfo(nil, 100, @Info) = 0) and Assigned(Info) then
  begin
   ListBox1.Items := EnumHosts(PChar(string(WideString(Info.wki100_langroup)))); // _WStrFromPWChar -> _LStrFromWStr -> _LStrToPChar (ugly casting!)
   LocalFree(Cardinal(Info)); // NetApiBufferFree
  end;
end;

Para prevenir MemoryLeak en lugar de asignación directa, considerar usar con:

Código Delphi [-]
function GetHostsList(Dest: TStrings; DesiredWorkgroup: string = ''): Boolean;
var List: TStrings;
begin
 if DesiredWorkgroup = '' then
  List := EnumHosts
 else
  List := EnumHosts(PChar(DesiredWorkgroup));
 Result := Assigned(List);
 if Result then
  begin
   Dest.Assign(List);
   List.Destroy;
   List.Free;
  end;
end;

cHackAll
Responder Con Cita