📄 getdomainthreadunit.pas
字号:
unit GetDomainThreadUnit;
interface
uses Windows, Messages, SysUtils, Classes,ComCtrls,Dialogs;
type
TGetDomainThread=class(TThread)
private
NodeS,RootS: string;
a : DWord;
ErrorS:string;
public
MyLanTree:TTreeView;
protected
procedure Execute; override;
procedure Initialize;
procedure InitializeTree;
procedure AddGroup;
procedure EndUpdate;
Procedure ExpandTree;
procedure ShowError;
end;
implementation
uses Main, FmxUtils;
{procedure ShowSplash;
var
DC:HDC;
Str:String;
begin
DC:=GetDC(0);
Try
Str:='Hello,life is like a box of chocolate!';
Textout(Dc,0,0,Pchar(Str),Length(Str));
finally
ReleaseDC(0,DC);
end;
end; }
procedure TGetDomainThread.ShowError;
begin
ShowMessage(ErrorS);
end;
procedure TGetDomainThread.Initialize;
begin
with MainForm do
begin
if Win32Platform = VER_PLATFORM_WIN32_NT then bNT:=true else bNT:=false;
ToolBtnAuto.Enabled := false;
ToolBtnRefresh.Enabled:=false;
StatusBar.Panels[0].Text := '正在打开网上邻居......';
//ToolBtnSeachIP.Enabled := false;
end;
//ShowSplash;
end;
procedure TGetDomainThread.InitializeTree;
var
Itm : TTreeNode;
begin
with MyLanTree do
begin
Items.BeginUpDate;
Items.Clear;
Itm:=Items.Add(MyLanTree.Selected,RootS);
Itm.ImageIndex:=3;
Itm.SelectedIndex:=3;
end;
with MainForm do
begin
cbBegin.Items.Clear;
cbEnd.Items.Clear;
end;
end;
procedure TGetDomainThread.AddGroup;
var
Itm : TTreeNode;
begin
with MainForm do
begin
with MyLanTree do
begin
Itm:=Items.AddChild(Items[0],NodeS);
GroupList[a]:=NodeS;
Itm.ImageIndex:=5;
Itm.Data := nil; //###
Itm.SelectedIndex:=5;//16;
inc(GroupNum);
StatusBar.Panels[3].Text :='共'+inttostr(GroupNum)+'个工作组 ';
cbBegin.Items.Add(NodeS);
cbEnd.Items.Add(NodeS);
end;
end;
end;
procedure TGetDomainThread.EndUpdate;
begin
MyLanTree.Items.EndUpdate;
end;
procedure TGetDomainThread.ExpandTree;
begin
with MainForm do
begin
StatusBar.Panels[0].Text := '完成';
if not CanOpen then showmessage('无法打开局域网,请尝试查找计算机,'
+'先找到你自己,然后按F5刷新。')
else
begin
try
if (MyLanTree.Items[0].HasChildren) then
begin
MyLanTree.Items[0].Expand(false);
StatusBar.Panels[0].Text := '完成,请单击目录树';
end
except on ETreeViewError do
begin
showmessage('ETreeViewError:无法打开局域网,请尝试查找计算机,'
+'找到你自己,然后刷新');
StatusBar.Panels[0].Text := '完成,无法打开局域网';
end;
end; //end of try
end;
ToolBtnRefresh.Enabled:=true;
//Application.BringToFront;
ToolBtnAuto.Enabled := true;
//BringFront;
//ToolBtnSeachIP.Enabled := true;
cbBegin.ItemIndex := 0;
cbEnd.ItemIndex := cbEnd.Items.Count - 1;
end;
end;
procedure TGetDomainThread.Execute;
var
ErrCode : Integer;
RootRes,NetRes : Array[0..1023] of TNetResource;
EnumHandle : THandle;
RootEnumEntries,EnumEntries: DWord;
BufferSize : DWord;
NoRoot : boolean;
begin
{ Start here }
CanOpen:=true;
noroot:=false;
SearchBeginNum:=0;
Synchronize(Initialize);
try
With RootRes[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 }
//-----------------------root------------------------------
ErrCode:=WNetOpenEnum( //若网不通或很烂,此处很费时
RESOURCE_GLOBALNET,
RESOURCETYPE_ANY,
RESOURCEUSAGE_CONTAINER,
@RootRes[0],
EnumHandle //输出
);
If ErrCode<>NO_ERROR then
begin
//showmessage('无法打开局域网0');
ErrorS:='无法打开局域网0';
synchronize(ShowError);
canOpen:=false;
exit;
end;
//showmessage(string(NetRes[0].lpProvider)+'--0');
If ErrCode=NO_ERROR then begin
EnumEntries:=1;
BufferSize:=SizeOf(RootRes);
{ErrCode:=}WNetEnumResource(
EnumHandle, //输入
RootEnumEntries,
@RootRes[0],
BufferSize
);
WNetCloseEnum(EnumHandle);
//-------------------------------------------------------
NetRes:=RootRes;
//ErrorS:=string(NetRes[1].lpProvider)+inttostr(enumEntries);
//synchronize(ShowError);
ErrCode:=WNetOpenEnum(
RESOURCE_GLOBALNET,
RESOURCETYPE_ANY,
RESOURCEUSAGE_CONTAINER,
@NetRes[0],
EnumHandle
);
IF ErrCode<>No_Error then
begin
NoRoot:= true;
//ErrorS:='no root!';
//synchronize(ShowError);
end
else
begin
EnumEntries:=1024;
BufferSize:=SizeOf(NetRes);
ErrCode:=WNetEnumResource(
EnumHandle,
EnumEntries,
@NetRes[0],
BufferSize
);
WNetCloseEnum(EnumHandle);
end;
//ErrorS:=string(NetRes[1].lpProvider)+inttostr(enumEntries);
//synchronize(ShowError);
IF (ErrCode=No_Error)or noroot or (os=osWinxp) then try
if os=osWinxp then
begin
NetRes[0]:=NetRes[1];
//#######################
ErrCode:=WNetOpenEnum(
RESOURCE_GLOBALNET,
RESOURCETYPE_ANY,
RESOURCEUSAGE_CONTAINER,
@NetRes[0],
EnumHandle
);
IF ErrCode<>No_Error then
begin
NoRoot:= true;
//ErrorS:='no root!';
//synchronize(ShowError);
end
else
begin
EnumEntries:=1024;
BufferSize:=SizeOf(NetRes);
{ErrCode:=}WNetEnumResource(
EnumHandle,
EnumEntries,
@NetRes[0],
BufferSize
);
WNetCloseEnum(EnumHandle);
end;
//#######################
end;
a:=0;
RootS:=string(NetRes[0].lpProvider);
Synchronize(InitializeTree);
//showmessage('xp');
// { get domains }
//noroot: win9x未出现根节点的情况
//(ver<=4)and(NetRes[0].lpRemoteName<>'')and(not bNT):win9x,HUB和外面断了
if noroot or((NetRes[0].lpRemoteName<>'')and(os=osWin9x)) then
begin
NetRes:=RootRes;
EnumEntries:=RootEnumEntries;
SearchBeginNum:=-1;
{ErrorS:='win9x未出现根节点或HUB和外面断了';
synchronize(ShowError);}
end;
if (OS<>osWin9x) then SearchBeginNum:=-1;
While a<enumEntries do with NetRes[a] do
begin
NodeS:=lpRemoteName;
Synchronize(AddGroup);
inc(a);
end
finally
Synchronize(EndUpdate);
end;
end;
finally
WNetCloseEnum(EnumHandle);
end;
Synchronize(ExpandTree);
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -