⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 getdomainthreadunit.pas

📁 最好的局域网搜索软件
💻 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 + -