Einzelnen Beitrag anzeigen

Benutzerbild von Mackhack
Mackhack

Registriert seit: 29. Nov 2003
Ort: San Diego, CA/USA
1.446 Beiträge
 
Delphi 2006 Architect
 
#1

ComboBox-Eintraege doppelt und x-fach vorhanden

  Alt 7. Dez 2006, 06:43
Hi DPler,

mit diesen beiden Functions ermittle ich die Workgroups und die dazugehoerigen Computernamen im Netzwerk.

Delphi-Quellcode:
function TfoNetworkConnection.GetNetComputerNames: String;
var
  I: Integer;
  hEnum: THandle;
  Entries: DWORD;
  BufferSize: DWORD;
  NetResourceBuf: Array[0..511] of TNetResource;
  NetResource: TNetResource;
begin
  if ( CbxWorkgroup.ItemIndex > -1 ) then
  begin
    CbxComputerName.Clear;
    try
      NetResource.dwScope := RESOURCE_GLOBALNET;
      NetResource.dwType := RESOURCETYPE_ANY;
      NetResource.dwDisplayType := RESOURCEDISPLAYTYPE_GENERIC;
      NetResource.dwUsage := RESOURCEUSAGE_CONNECTABLE;
      NetResource.lpLocalName := nil;
      NetResource.lpRemoteName := PChar(CbxWorkgroup.Items[CbxWorkgroup.ItemIndex]);
      NetResource.lpComment := nil;
      NetResource.lpProvider := nil;

      if ( WNetOpenEnum(RESOURCE_GLOBALNET, RESOURCETYPE_ANY, 0, @NetResource, hEnum) <> NO_ERROR ) then
      begin
        ShowMessage('Could not connect to workgroup: ' + String(NetResource.lpRemoteName) + ' Error was: 0x' + IntToHex(GetLastError, 8));
        Exit;
      end;
      Entries := DWORD(-1);
      BufferSize := DWORD(16384);
      while ( WNetEnumResource(hEnum, Entries, @NetResourceBuf[0], BufferSize) = NO_ERROR ) do
      begin
        for I := 0 to Entries - 1 do
        begin
          if ( (CompareText(NetResourceBuf[I].lpRemoteName, '\\' + GetLocalComputerName) <> 0) ) then
          begin
            CbxComputerName.Items.Add(NetResourceBuf[I].lpRemoteName)
          end;
        end;
      end;
    finally
      WNetCloseEnum(hEnum);
    end;
  end;
end;

function TfoNetworkConnection.GetWorkgroups: String;
var
  NetResourceBuf, NetResourceBuf2: Array[0..511] of TNetResource;
  I: Integer;
  J: Integer;
  hEnum, hEnum2: THandle;
  Entries: DWORD;
  Entries2: DWORD;
  BufferSize: DWORD;
begin
  if ( WNetOpenEnum(RESOURCE_GLOBALNET, RESOURCETYPE_ANY, 0, nil, hEnum) <> NO_ERROR ) then
  begin
    Exit;
  end;
  Entries := DWORD(-1);
  BufferSize := DWORD(16384);
  while ( WNetEnumResource(hEnum, Entries, @NetResourceBuf[0], BufferSize) = NO_ERROR ) do
  begin
    try
      for I := 0 to Entries - 1 do
      if ( (NetResourceBuf[I].dwUsage and RESOURCEUSAGE_CONTAINER) = RESOURCEUSAGE_CONTAINER) and (Pos('Microsoft Windows', NetResourceBuf[I].lpRemoteName) = 1 ) then
      begin
        try
          if ( WNetOpenEnum(RESOURCE_GLOBALNET, RESOURCETYPE_ANY, 0, @NetResourceBuf[I], hEnum2) <> NO_ERROR ) then
          begin
            ShowMessage('Error enumerating Microsoft Network Resources!');
            Exit;
          end;
          Entries2 := DWORD(-1);
          while ( WNetEnumResource(hEnum2, Entries2, @NetResourceBuf2[0], BufferSize) = NO_ERROR ) do
          begin
            for J := 0 to Entries2 - 1 do
            begin
              CbxWorkgroup.Items.Add(String(NetResourceBuf2[J].lpRemoteName));
            end;
          end;
        finally
          WNetCloseEnum(hEnum2);
        end;
      end;
    finally
      WNetCloseEnum(hEnum);
    end;
  end;
end;
Ich starte die Workgroupsuche mit einem Buttonclick vorerst noch. Was mir jetzt aber aufgefallen ist ist folgendes:
Wenn ich auf den Button das 2...xte mal klicke kommen alle Workgroups 2 mal, 3 mal usw. Eben so oft man auf den Button drueck so oft wird die ComboBox gefuellt. Wie kann ich diese Misere Sinnvoll ausbuegeln?

Danke!
Um etwas Neues zu schaffen muss man seine Ohren vor den Nein-sagern verschliessen um seinen Geist öffnen zu können.
(George Lukas)
  Mit Zitat antworten Zitat