如何在程序中动态取得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;

解决方案 »

  1.   

    要列举网络中的工作组信息,首先要获取网络中的网络类型,再获取每一种类型网络中包含的
    工作组的名称。
      1、获取网络类型信息
        局域网中可以是由多种类型的网络组成,如由Microsoft、Novell等类型的网络组成。用API
      函数WNetOpenEnum和WNetEnumResource可以获取网络类型信息。
      (1)用WNetOpenEnum函数返回一个句柄,作为WNetEnumResource列举网络资源的依据。我们的目
       标是列举“整个网络”的工作组名称,因而网络范围为RESOURCE_GLOBALNET(所有机器)、资源类
       型为RESOURCETYPE_DISK(文件资源)、资源用途为RESOURCEUSAGE_CONTAINER(所有container资源)、
       网络层次为最高层(NIL),这样可以得到一个句柄,以便进一步列举网络资源。具体的程序段如下:
          { Res : DWORD; lphEnum : THandle; }
          Res := WNetOpenEnum( RESOURCE_GLOBALNET, RESOURCETYPE_DISK,
                               RESOURCEUSAGE_CONTAINER, Nil,lphEnum);
          If Res <> NO_ERROR Then exit;//执行失败
      (2)用API函数WNetEnumResource可以获取网络类型信息,此时要用到上面获取的句柄lphEnum,
       可以获取一个NetResource类型的数组,每个NetResource元素即为一种网络类型信息。
       具体的请参见以下程序段及注释信息。
    type
        TNetResourceArray = ^TNetResource;//网络类型的数组
    Var
      NetResource : TNetResource;
      Buf                 : Pointer;
      Count,BufSize,Res   : DWORD;
      lphEnum         : THandle;
      p                     : TNetResourceArray;
      i,j                   : SmallInt;
      NetworkTypeList : TList;
    begin
          ......
          Count := $FFFFFFFF;//不限资源数目
          BufSize := 8192;//缓冲区大小设置为8K
          GetMem(Buf, BufSize);//申请内存,用于获取工作组信息
          Res := WNetEnumResource(lphEnum, Count, Pointer(Buf), BufSize);//获取网络类型信息
          If ( Res = ERROR_NO_MORE_ITEMS )//资源列举完毕
          or (Res <> NO_ERROR )//执行失败
          Then Exit;
          P := TNetResourceArray(Buf);
          For I := 0 To Count - 1 Do//记录各个网络类型的信息
          Begin
              NetworkTypeList.Add(p);
              Inc(P);
          End;
          ......
    end;
      2、获取工作组信息
        在获取网络类型信息后,可以根据此信息获取此类型网络中的服务器(工作组)信息。
        在WNetOpenEnum函数中,将参数lpNetResource指定为一种网络类型信息,可以获取一
    个句柄,在WNetEnumResource中利用这个句柄,可以获取一个NetResource类型的数组,每个
    NetResource元素的lpRemoteName部分即为一个工作组名称(如“MyWorkGroup”)。
        具体的请参见以下程序段及注释信息。
          //列出一个网络类型中的所有工作组名称
              NetResource := TNetResource(NetworkTypeList.Items[J]^);//网络类型信息
    //获取某个网络类型的文件资源的句柄,NetResource为网络类型信息,lphEnum为返回句柄
              Res := WNetOpenEnum(RESOURCE_GLOBALNET, RESOURCETYPE_DISK,
                                  RESOURCEUSAGE_CONTAINER, @NetResource,lphEnum);
              If Res <> NO_ERROR Then break;//执行失败          While true Do//列举一个网络类型的所有工作组的信息
              Begin
                  Count := $FFFFFFFF;//不限资源数目
                  BufSize := 8192;//缓冲区大小设置为8K
                  GetMem(Buf, BufSize);//申请内存,用于获取工作组信息
                  //获取一个网络类型的文件资源信息,
                  Res := WNetEnumResource(lphEnum, Count, Pointer(Buf), BufSize);
                  If ( Res = ERROR_NO_MORE_ITEMS ) //资源列举完毕
                  or (Res <> NO_ERROR) //执行失败
                  then break;
                  P := TNetResourceArray(Buf);
                  For I := 0 To Count - 1 Do//列举各个工作组的信息
                  Begin
                      List.Add( StrPAS( P^.lpRemoteName ));//取得一个工作组的名称
                      Inc(P);
                  End;
              End;  3、获取工作组信息的完全源代码
    //列举出整个网络中的工作组名称,返回值为TRUE表示执行成功,
    //参数List中返回服务器(工作组)的名称
    Function GetServerList( var List : TStringList ) : Boolean;
    Var
      NetResource : TNetResource;
      Buf                 : Pointer;
      Count,BufSize,Res   : DWORD;
      lphEnum         : THandle;
      p                     : TNetResourceArray;
      i,j                   : SmallInt;
      NetworkTypeList : TList;
    Begin
      Result := False;
      NetworkTypeList := TList.Create;
      List.Clear;
    //获取整个网络中的文件资源的句柄,lphEnum为返回名柄
          Res := WNetOpenEnum( RESOURCE_GLOBALNET, RESOURCETYPE_DISK,
                               RESOURCEUSAGE_CONTAINER, Nil,lphEnum);
          If Res <> NO_ERROR Then exit;//Raise Exception(Res);//执行失败
    //获取整个网络中的网络类型信息
          Count := $FFFFFFFF;//不限资源数目
          BufSize := 8192;//缓冲区大小设置为8K
          GetMem(Buf, BufSize);//申请内存,用于获取工作组信息
          Res := WNetEnumResource(lphEnum, Count, Pointer(Buf), BufSize);
          If ( Res = ERROR_NO_MORE_ITEMS )//资源列举完毕
          or (Res <> NO_ERROR )//执行失败
          Then Exit;
          P := TNetResourceArray(Buf);
          For I := 0 To Count - 1 Do//记录各个网络类型的信息
          Begin
              NetworkTypeList.Add(p);
              Inc(P);
          End;      //WNetCloseEnum关闭一个列举句柄
          Res := WNetCloseEnum(lphEnum);//关闭一次列举
          If Res <> NO_ERROR Then exit;      For J := 0 To NetworkTypeList.Count-1 Do //列出各个网络类型中的所有工作组名称
          Begin//列出一个网络类型中的所有工作组名称
              NetResource := TNetResource(NetworkTypeList.Items[J]^);//网络类型信息
    //获取某个网络类型的文件资源的句柄,NetResource为网络类型信息,lphEnum为返回名柄
              Res := WNetOpenEnum(RESOURCE_GLOBALNET, RESOURCETYPE_DISK,
                                  RESOURCEUSAGE_CONTAINER, @NetResource,lphEnum);
              If Res <> NO_ERROR Then break;//执行失败          While true Do//列举一个网络类型的所有工作组的信息
              Begin
                  Count := $FFFFFFFF;//不限资源数目
                  BufSize := 8192;//缓冲区大小设置为8K
                  GetMem(Buf, BufSize);//申请内存,用于获取工作组信息
                  //获取一个网络类型的文件资源信息,
                  Res := WNetEnumResource(lphEnum, Count, Pointer(Buf), BufSize);
                  If ( Res = ERROR_NO_MORE_ITEMS ) //资源列举完毕
                  or (Res <> NO_ERROR) //执行失败
                  then break;
                  P := TNetResourceArray(Buf);
                  For I := 0 To Count - 1 Do//列举各个工作组的信息
                  Begin
                      List.Add( StrPAS( P^.lpRemoteName ));//取得一个工作组的名称
                      Inc(P);
                  End;
              End;
              Res := WNetCloseEnum(lphEnum);//关闭一次列举
              If Res <> NO_ERROR Then break;//执行失败
          End;
          Result := True;
          FreeMem(Buf);
          NetworkTypeList.Destroy;
    End;
      

  2.   

    如何在程序中动态取得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;
      

  3.   

    请注意一点,我只想知道自己正在使用的计算机的工作组名,比如知道自己的计算机名可以用GETCOMPUTERNAME的函数。我只不过是不知道知道工作组名的函数