delphi 编程技巧

源代码在线查看: 如何在程序中动态取得win9598的网络邻居中的工作.txt

软件大小: 774 K
上传用户: zyhunicom
关键词: delphi 编程技巧
下载地址: 免注册下载 普通下载 VIP

相关代码

				如何在程序中动态取得Win95/98的网络邻居中的工作组及计算机名? (2000年9月9日) 
				
				本站更新  分类:   作者:srw  推荐:   阅读次数:1072  
				(http://www.codesky.net)  
				
				--------------------------------------------------------------------------------
				[本文不能保证绝对正确, 仅供参考]
				
				如何在程序中动态取得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.
				
				==============================================
				http://leonyxl.yeah.net/ 
				==============================================
				
				 
				 
							

相关资源