Registriert seit: 29. Nov 2003
Ort: San Diego, CA/USA
1.446 Beiträge
Delphi 2006 Architect
|
ComboBox-Eintraege doppelt und x-fach vorhanden
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)
|
|
Zitat
|