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

📄 fmmain.pas

📁 < Delphi网络通信协议分析与应用实现>>一书的源代码。
💻 PAS
字号:
unit fmMain;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, ComCtrls, ImgList;

type
  TMainForm = class(TForm)
    TV: TTreeView;
    ImageList1: TImageList;
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  MainForm: TMainForm;

implementation

{$R *.DFM}


const InitialSize = $1;  // Any positive value is acceptable.

type
    TNetEnumThread = class(TThread)
        ChildNode: String;
        TreeNode: TTreeNode;
        imgIndex,selIndex:integer;
        procedure AddChildNode;
        procedure Execute; override;
        procedure LoadNetNode(NetNode: PNetResourceA);
    end;

procedure TNetEnumThread.Execute;
begin
    TreeNode:=nil;
    LoadNetNode(nil);
end;

procedure TNetEnumThread.AddChildNode();
begin
    TreeNode:=MainForm.TV.Items.AddChild(TreeNode,ChildNode);
    treenode.ImageIndex:=imgIndex;
    treenode.SelectedIndex:=selIndex;
end;

procedure TNetEnumThread.LoadNetNode(NetNode: PNetResourceA);
var hEnum : THandle;
    Count,BufSize, Usage: DWORD;
    NR,Buf: PNetResourceA;
    R: Integer;
    CurrentNode: TTreeNode;
begin
    R:=WNetOpenEnum(RESOURCE_GLOBALNET,RESOURCETYPE_ANY,0
    {RESOURCEUSAGE_CONTAINER},NetNode,hEnum);
    if R <> NO_ERROR then exit;

    BufSize:=InitialSize; GetMem(Buf,BufSize);
    try
        while True do
        begin
            Count:=$FFFFFFFF; //读取所有的网络组
            R:=WNetEnumResource(hEnum,Count, Buf, BufSize);

            if R = ERROR_MORE_DATA then //分配的内存不够
            begin
                Count:=$FFFFFFFF; //读取所有的资源
                FreeMem(Buf); GetMem(Buf,BufSize);
                R:=WNetEnumResource(hEnum,Count, Buf, BufSize);
            end;
            //该节点下所有的网络资源已经取得
            if R = ERROR_NO_MORE_ITEMS then Break;
            if R <> NO_ERROR then Abort; //出错

            NR:=Buf;
            while Count > 0 do
            begin
                CurrentNode:=TreeNode; //取得当前节点

                if NR.lpRemoteName <> nil then
                    ChildNode:=StrPas(NR.lpRemoteName)
                else
                    ChildNode:='';

                // 获取每个资源节点的信息
                ChildNode:=ChildNode+' 【DisplayType=';
                case NR.dwDisplayType of
                    RESOURCEDISPLAYTYPE_GENERIC:
                        ChildNode:=ChildNode+'Generic';
                    RESOURCEDISPLAYTYPE_DOMAIN:
                        ChildNode:=ChildNode+'Domain';
                    RESOURCEDISPLAYTYPE_SERVER:
                        ChildNode:=ChildNode+'Server';
                    RESOURCEDISPLAYTYPE_SHARE:
                        ChildNode:=ChildNode+'Share';
                    RESOURCEDISPLAYTYPE_FILE:
                        ChildNode:=ChildNode+'File';
                    RESOURCEDISPLAYTYPE_GROUP:
                        ChildNode:=ChildNode+'Group';
                    RESOURCEDISPLAYTYPE_NETWORK:
                        ChildNode:=ChildNode+'Network';
                    RESOURCEDISPLAYTYPE_ROOT:
                        ChildNode:=ChildNode+'Root';
                    RESOURCEDISPLAYTYPE_SHAREADMIN:
                        ChildNode:=ChildNode+'ShareAdmin';
                    RESOURCEDISPLAYTYPE_DIRECTORY:
                        ChildNode:=ChildNode+'Directory';
                    RESOURCEDISPLAYTYPE_TREE:
                        ChildNode:=ChildNode+'Tree';
                    RESOURCEDISPLAYTYPE_NDSCONTAINER:
                        ChildNode:=ChildNode+'NDS Container';
                else
                    ChildNode:=ChildNode+'? ('+IntToStr(NR.dwDisplayType)+')';
                end;

                imgIndex:=NR.dwDisplayType;
                selIndex:=NR.dwDisplayType;
                if NR.dwScope = RESOURCE_GLOBALNET then
                begin
                    ChildNode:=ChildNode+'  Usage=';
                    Usage:=NR.dwUsage;//资源用途
                    if (Usage and RESOURCEUSAGE_CONNECTABLE) <> 0 then
                        ChildNode:=ChildNode+'Connectable;';
                    Usage:=Usage and not RESOURCEUSAGE_CONNECTABLE;
                    if (Usage and RESOURCEUSAGE_CONTAINER) <> 0 then
                        ChildNode:=ChildNode+'Container;';
                    Usage:=Usage and not RESOURCEUSAGE_CONTAINER;
                    if (Usage and RESOURCEUSAGE_NOLOCALDEVICE) <> 0 then
                        ChildNode:=ChildNode+'NoLocalDevice';
                    Usage:=Usage and not RESOURCEUSAGE_NOLOCALDEVICE;
                    if (Usage and RESOURCEUSAGE_SIBLING) <> 0 then
                        ChildNode:=ChildNode+'Sibling';
                    Usage:=Usage and not RESOURCEUSAGE_SIBLING;
                    if (Usage and RESOURCEUSAGE_ATTACHED) <> 0 then
                        ChildNode:=ChildNode+'Attached';
                    Usage:=Usage and not RESOURCEUSAGE_ATTACHED;
                    if (Usage and RESOURCEUSAGE_RESERVED) <> 0 then
                        ChildNode:=ChildNode+'Reserved';
                    Usage:=Usage and not RESOURCEUSAGE_RESERVED;
                    if Usage <> 0 then
                        ChildNode:=ChildNode+'? ('+IntToHex(Usage,8)+')';
                end;

                //资源类型
                ChildNode:=ChildNode+'  Type=';
                case NR.dwType of
                    RESOURCETYPE_ANY: ChildNode:=ChildNode+'Any';
                    RESOURCETYPE_DISK: ChildNode:=ChildNode+'Disk';
                    RESOURCETYPE_PRINT: ChildNode:=ChildNode+'Print';
                else
                    ChildNode:=ChildNode+'?';
                end;

                //资源范围
                ChildNode:=ChildNode+'  Scope=';
                case NR.dwScope of
                    RESOURCE_CONNECTED: ChildNode:=ChildNode+'Connected';
                    RESOURCE_GLOBALNET: ChildNode:=ChildNode+'Globalnet';
                    RESOURCE_REMEMBERED: ChildNode:=ChildNode+'Remembered';
                else
                    ChildNode:=ChildNode+'?';
                end;
                ChildNode:=ChildNode+'】';
                //加入资源节点
                Synchronize(AddChildNode);
                //加入子节点
                LoadNetNode(NR);
                TreeNode:=CurrentNode;
                INC(NR);
                DEC(Count);
            end;
        end;
    finally
        WNetCloseEnum(hEnum); //关闭枚举网络句柄
        FreeMem(Buf); //释放内存
    end;
end;

procedure TMainForm.FormCreate(Sender: TObject);
begin
    TNetEnumThread.Create(False);
end;

end.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -