[摘要]如何在程序中动态取得Win95/98的网络邻居中的工作组及计算机名? 可参考下面代码,或许有所帮助: procedure GetDomainList(TV:TTreeView); var a... 如何在程序中动态取得Win95/98的网络邻居中的工作组及计算机名? 可参考下面代码,或许有所帮助: procedure GetDomainList(TV:TTreeView); var a : Integer; ErrCode : Integer; NetRes : Array[0..1023] of TNetResource; EnumHandle : THandle; EnumEntries : DWord; BufferSize : DWord; s : string; itm : TTreeNode; begin { Start here } try With NetRes[0] do begin dwScope :=RESOURCE_GLOBALNET; dwType :=RESOURCETYPE_ANY; dwDisplayType :=RESOURCEDISPLAYTYPE_DOMAIN; dwUsage :=RESOURCEUSAGE_CONTAINER; lpLocalName :=NIL; lpRemoteName :=NIL; lpComment :=NIL; lpProvider :=NIL; end; { get net root } ErrCode:=WNetOpenEnum( RESOURCE_GLOBALNET, RESOURCETYPE_ANY, RESOURCEUSAGE_CONTAINER, @NetRes[0], EnumHandle ); If ErrCode=NO_ERROR then begin EnumEntries:=1; BufferSize:=SizeOf(NetRes); ErrCode:=WNetEnumResource( EnumHandle, EnumEntries, @NetRes[0], BufferSize ); WNetCloseEnum(EnumHandle); ErrCode:=WNetOpenEnum( RESOURCE_GLOBALNET, RESOURCETYPE_ANY, RESOURCEUSAGE_CONTAINER, @NetRes[0], EnumHandle ); EnumEntries:=1024; BufferSize:=SizeOf(NetRes); ErrCode:=WNetEnumResource( EnumHandle, EnumEntries, @NetRes[0], BufferSize ); IF ErrCode=No_Error then with TV do try a:=0; Items.BeginUpDate; Items.Clear; Itm:=Items.Add(TV.Selected,string(NetRes[0].lpProvider)); Itm.ImageIndex:=0; Itm.SelectedIndex:=0; { get domains } 下面的一个单元定义了一个组件. TNetworkBrowser, 可以枚举hierachical树上所有 的网络资源. 实际上浏览是要花费很长时间的,这您可以通过在WINDOWS资源管理器 中打开"整个网络" 来比较一下. 如果你设置SCOPE属性 为nsContext , 你就可以看到 和网络邻居中一样的机器列表. unit NetBrwsr; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs; type TNetScope = (nsConnected, nsGlobal, nsRemembered, nsContext); TNetResourceType = (nrAny, nrDisk, nrPrint); TNetDisplay = (ndDomain, ndGeneric, ndServer, ndShare, ndFile, ndGroup, ndNetwork, ndRoot, ndShareAdmin, ndDirectory, ndTree, ndNDSContainer); TNetUsage = set of (nuConnectable, nuContainer); TNetworkItems = class; TNetworkItem = class private FScope: TNetScope; FResourceType: TNetResourceType; FDisplay: TNetDisplay; FUsage: TNetUsage; FLocalName: string; FRemoteName: string; FComment: string; FProvider: string; FSubItems: TNetworkItems; public constructor Create; destructor Destroy; override; property Scope: TNetScope read FScope; property ResourceType: TNetResourceType read FResourceType; property Display: TNetDisplay read FDisplay; property Usage: TNetUsage read FUsage; property LocalName: string read FLocalName; property RemoteName: string read FRemoteName; property Comment: string read FComment; property Provider: string read FProvider; property SubItems: TNetworkItems read FSubItems; end; TNetworkItems = class private FList: TList; procedure SetItem(Index: Integer; Value: TNetworkItem); function GetItem(Index: Integer): TNetworkItem; function GetCount: Integer; public constructor Create; destructor Destroy; override; procedure Clear; procedure Add(Item: TNetworkItem); procedure Delete(Index: Integer); property Items[Index: Integer]: TNetworkItem read GetItem write SetItem; default; property Count: Integer read GetCount; end; TNetworkBrowser = class(TComponent) private FItems: TNetworkItems; FScope: TNetScope; FResourceType: TNetResourceType; FUsage: TNetUsage; FActive: Boolean; procedure Refresh; procedure SetActive(Value: Boolean); procedure SetScope(Value: TNetScope); procedure SetResourceType(Value: TNetResourceType); procedure SetUsage(Value: TNetUsage); procedure EnumerateNet(NetItems: TNetworkItems; lpnr: PNetResource); protected public constructor Create(AOwner: TComponent); override; destructor Destroy; override; procedure Open; procedure Close; property Items: TNetworkItems read FItems; published property Scope: TNetScope read FScope write SetScope default nsGlobal; property ResourceType: TNetResourceType read FResourceType write SetResourceType default nrAny; property Usage: TNetUsage read FUsage write SetUsage default []; property Active: Boolean read FActive write SetActive default False; end; implementation type PNetResourceArray = ^TNetResourceArray; TNetResourceArray = array[0..0] of TNetResource; { TNetworkItem } constructor TNetworkItem.Create; begin inherited; FSubItems := TNetworkItems.Create; end; destructor TNetworkItem.Destroy; begin if FSubItems <> nil then FSubItems.Free; inherited; end; { TNetworkItems } constructor TNetworkItems.Create; begin inherited; FList := TList.Create; end; destructor TNetworkItems.Destroy; begin Clear; if FList <> nil then FList.Free; inherited; end; procedure TNetworkItems.SetItem(Index: Integer; Value: TNetworkItem); begin if (FList.Items[Index] <> nil) and (FList.Items[Index] <> Value) then TNetworkItem(FList.Items[Index]).Free; FList.Items[Index] := Value; end; function TNetworkItems.GetItem(Index: Integer): TNetworkItem; begin Result := TNetworkItem(FList.Items[Index]); end; procedure TNetworkItems.Clear; begin while Count > 0 do Delete(0); end; procedure TNetworkItems.Add(Item: TNetworkItem); begin FList.Add(Item); end; procedure TNetworkItems.Delete(Index: Integer); begin if FList.Items[Index] <> nil then TNetworkItem(FList.Items[Index]).Free; FList.Delete(Index); end; function TNetworkItems.GetCount: Integer; begin if FList <> nil then Result := FList.Count else Result := 0; end; { TNetworkBrowser } constructor TNetworkBrowser.Create(AOwner: TComponent); begin inherited Create(AOwner); FItems := TNetworkItems.Create; FScope := nsGlobal; FResourceType := nrAny; FUsage := []; end; destructor TNetworkBrowser.Destroy; begin if FItems <> nil then FItems.Free; inherited; end; procedure TNetworkBrowser.EnumerateNet(NetItems: TNetworkItems; lpnr: PNetResource); var dwResult, dwResultEnum: Integer; hEnum: THandle; cbBuffer, cEntries, i: Integer; nrArray: PNetResourceArray; NewItem: TNetworkItem; dwScope, dwType, dwUsage: Integer; begin cbBuffer := 16384; cEntries := $FFFFFFFF; case FScope of nsConnected: dwScope := RESOURCE_CONNECTED; nsGlobal: dwScope := RESOURCE_GLOBALNET; nsRemembered: dwScope := RESOURCE_REMEMBERED; nsContext: dwScope := RESOURCE_CONTEXT; else dwScope := RESOURCE_GLOBALNET; end; case FResourceType of nrAny: dwType := RESOURCETYPE_ANY; nrDisk: dwType := RESOURCETYPE_DISK; nrPrint: dwType := RESOURCETYPE_PRINT; else dwType := RESOURCETYPE_ANY; end; dwUsage := 0; if nuConnectable in FUsage then dwUsage := dwUsage or RESOURCEUSAGE_CONNECTABLE; if nuContainer in FUsage then dwUsage := dwUsage or RESOURCEUSAGE_CONTAINER; dwResult := WNetOpenEnum(dwScope, dwType, dwUsage, lpnr, hEnum); if dwResult <> NO_ERROR then Exit; GetMem(nrArray, cbBuffer); repeat dwResultEnum := WNetEnumResource(hEnum, cEntries, nrArray, cbBuffer); if dwResultEnum = NO_ERROR then for i := 0 to cEntries-1 do begin NewItem := TNetworkItem.Create; case nrArray[i].dwScope of RESOURCE_CONNECTED: NewItem.FScope := nsConnected; RESOURCE_GLOBALNET: NewItem.FScope := nsGlobal; RESOURCE_REMEMBERED: NewItem.FScope := nsRemembered; RESOURCE_CONTEXT: NewItem.FScope := nsContext; else NewItem.FScope := nsGlobal; end; case nrArray[i].dwType of RESOURCETYPE_ANY: NewItem.FResourceType := nrAny; RESOURCETYPE_DISK: NewItem.FResourceType := nrDisk; RESOURCETYPE_PRINT: NewItem.FResourceType := nrPrint; else NewItem.FResourceType := nrAny; end; case nrArray[i].dwDisplayType of RESOURCEDISPLAYTYPE_GENERIC: NewItem.FDisplay := ndGeneric; RESOURCEDISPLAYTYPE_DOMAIN: NewItem.FDisplay := ndDomain; RESOURCEDISPLAYTYPE_SERVER: NewItem.FDisplay := ndServer; RESOURCEDISPLAYTYPE_SHARE: NewItem.FDisplay := ndShare; RESOURCEDISPLAYTYPE_FILE: NewItem.FDisplay := ndFile; RESOURCEDISPLAYTYPE_GROUP: NewItem.FDisplay := ndGroup; RESOURCEDISPLAYTYPE_NETWORK: NewItem.FDisplay := ndNetwork; RESOURCEDISPLAYTYPE_ROOT: NewItem.FDisplay := ndRoot; RESOURCEDISPLAYTYPE_SHAREADMIN: NewItem.FDisplay := ndShareAdmin; RESOURCEDISPLAYTYPE_DIRECTORY: NewItem.FDisplay := ndDirectory; RESOURCEDISPLAYTYPE_TREE: NewItem.FDisplay := ndTree; RESOURCEDISPLAYTYPE_NDSCONTAINER: NewItem.FDisplay := ndNDSContainer; else NewItem.FDisplay := ndGeneric; end; NewItem.FUsage := []; if nrArray[i].dwUsage and RESOURCEUSAGE_CONNECTABLE <> 0 then Include(NewItem.FUsage, nuConnectable); if nrArray[i].dwUsage and RESOURCEUSAGE_CONTAINER <> 0 then Include(NewItem.FUsage, nuContainer); NewItem.FLocalName := StrPas(nrArray[i].lpLocalName); NewItem.FRemoteName := StrPas(nrArray[i].lpRemoteName); NewItem.FComment := StrPas(nrArray[i].lpComment); NewItem.FProvider := StrPas(nrArray[i].lpProvider); NetItems.Add(NewItem); // if container, call recursively if (nuContainer in NewItem.FUsage) and (FScope <> nsContext) then EnumerateNet(NewItem.FSubItems, @nrArray[i]) end; until dwResultEnum = ERROR_NO_MORE_ITEMS; FreeMem(nrArray); WNetCloseEnum(hEnum); end; procedure TNetworkBrowser.Refresh; begin FItems.Clear; if FActive then EnumerateNet(FItems, nil); end; procedure TNetworkBrowser.SetActive(Value: Boolean); begin if Value <> FActive then begin FActive := Value; Refresh; end; end; procedure TNetworkBrowser.SetScope(Value: TNetScope); begin if Value <> FScope then begin FScope := Value; Refresh; end; end; procedure TNetworkBrowser.SetResourceType(Value: TNetResourceType); begin if Value <> FResourceType then begin FResourceType := Value; Refresh; end; end; procedure TNetworkBrowser.SetUsage(Value: TNetUsage); begin if Value <> FUsage then begin FUsage := Value; Refresh; end; end; procedure TNetworkBrowser.Open; begin Active := True; end; procedure TNetworkBrowser.Close; begin Active := False; end; end. |