Q&A

  • 내컴퓨터의 워크그룹 알아내기
내 컴퓨터에 설정된 워크그룹을 알수 있는 방법이 있나요



그리고 WNetOpenEnum을 쓰면 98에서는 전체 그룹이 나오는데

nt나 2000은 microsoft windows network 만 검색되고 그 밑은 검색할 수 없거든요

ipremotename에 'microsoft windows network'를 써넣으면 암것도 검색안돼구요.



일단 내컴의 워크그룹을 안다면 그나마 내그룹 컴들은 알수 있을것 같거든요



전문가님들의 조언 부탁합니다.

2  COMMENTS
  • Profile
    컴맹.. 2001.04.06 19:59
    안녕하세여.. 컴맹입니다...

    요즘 넘 바뻐서 기냥 소스만 올립니다..

    구현은 WNetOpenEnum 함수로 했어여...

    주석은 없습니다..(시간 관계상...)

    필요하시면 다시 질문올리시면.. 소스를 보내드리겠습니다..







    unit Unit1;



    interface



    uses

    Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,

    StdCtrls, ComCtrls,ShellAPI,ShlObj, Buttons;



    type

    TForm1 = class(TForm)

    TreeView1: TTreeView;

    Button1: TButton;

    procedure FormCreate(Sender: TObject);

    procedure Button1Click(Sender: TObject);

    procedure TreeView1Expanding(Sender: TObject; Node: TTreeNode;

    var AllowExpansion: Boolean);

    private



    { Private declarations }

    public

    procedure CreateSysIcons;

    { Public declarations }

    end;



    var

    Form1: TForm1;

    SysLIcon ,SysSIcon : TImageList;



    implementation



    {$R *.DFM}



    procedure Tform1.CreateSysIcons;

    var

    SysIconImageHandle : UINT;

    SHFileInfo : TSHFileInfo;



    begin

    SysLIcon := TImageList.Create(Self);

    SysIconImageHandle := SHGetFileInfo('',0,SHFileInfo,SizeOf( SHFileInfo ),

    SHGFI_SYSICONINDEX or SHGFI_LARGEICON );

    if SysIconImageHandle <> 0 then

    begin

    SysLIcon.Handle := SysIconImageHandle;

    SysLIcon.ShareImages := True;

    end;



    SysSIcon := TImageList.Create(Self);

    SysIconImageHandle := ShGetFileInfo('',0,SHFileInfo,SizeOf(ShFileInfo),

    SHGFI_SYSICONINDEX or SHGFI_SMALLICON );

    if SysIconImageHandle <> 0 then

    begin

    SysSIcon.Width := 16;

    SysSIcon.Height := 16;

    SysSIcon.Handle := SysIconImageHandle;

    SysSIcon.ShareImages := True;

    end;

    end;





    procedure GetServerList(TV: TTreeView; Node: TTreeNode);



    var



    a: Integer;



    ErrCode: Integer;



    NetRes: array[0..1023] of TNetResource;



    EnumHandle: THandle;



    EnumEntries: DWord;



    BufferSize: DWord;



    s: string;



    itm: TTreeNode;



    SHFileInfo : TSHFileInfo;

    begin



    if not Node.HasChildren then



    try



    Screen.Cursor := crHourglass;



    with NetRes[0] do



    begin



    dwScope := RESOURCE_GLOBALNET;



    dwType := RESOURCETYPE_ANY;



    dwDisplayType := RESOURCEDISPLAYTYPE_generic;



    dwUsage := RESOURCEUSAGE_CONTAINER;



    lpLocalName := nil;



    lpRemoteName := pChar(Tv.Selected.Text);



    lpComment := nil;



    lpProvider := nil;



    end;







    ErrCode := WNetOpenEnum(



    RESOURCE_GLOBALNET,



    RESOURCETYPE_ANY,



    RESOURCEUSAGE_CONTAINER,



    @NetRes[0],



    EnumHandle



    );



    if ErrCode = NO_ERROR then



    begin



    EnumEntries := 1023;



    BufferSize := SizeOf(NetRes);



    ErrCode := WNetEnumResource(



    EnumHandle,



    EnumEntries,



    @NetRes[0],



    BufferSize



    );



    if ErrCode = No_Error then



    with TV do



    try



    a := 0;



    Items.BeginUpdate;

    s := NetRes[0].lpRemoteName;

    SHGetFileInfo(Pchar(s),0,SHFileInfo,

    sizeOf(ShFileInfo),SHGFI_ICON or SHGFI_TYPENAME);

    while a < enumEntries do



    with NetRes[a] do



    begin

    s := lowercase(lpRemoteName);



    Delete(s, 1, 2);

    // itm.HasChildren := true;

    itm := Items.AddChild(node, s);





    itm.selectedIndex := ShFileInfo.iIcon;



    itm.imageindex := ShFileInfo.iIcon;



    inc(a);



    end;



    finally



    Node.expand(false);



    Items.EndUpdate;



    end;



    end;



    finally



    Screen.Cursor := crDefault;



    WNetCloseEnum(EnumHandle);



    end;



    end;







    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;

    SHFileInfo : TSHFileInfo;



    Pid : PItemIDList;

    begin



    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;



    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));



    IF SHGetSpecialFolderLocation(Form1.Handle,CSIDL_NETWORK,Pid) = S_OK then

    SHGetFileInfo(Pchar(Pid),0,SHFileInfo,SizeOf(SHFileInfo),SHGFI_ICON or SHGFI_TYPENAME);







    // Itm.ImageIndex:=SHFileInfo.iIcon;



    while a < enumEntries do





    with NetRes[a] do



    begin



    s := lpRemoteName;



    Itm := Items.AddChild(Items[0], S);

    Itm.ImageIndex := ShFileInfo.iIcon;



    Itm.SelectedIndex := ShFileInfo.iIcon;



    inc(a);



    end;



    finally



    Items.EndUpdate;



    end;



    end;



    finally



    WNetCloseEnum(EnumHandle);



    end;



    end;







    procedure TForm1.FormCreate(Sender: TObject);

    begin

    CreateSysIcons;

    TreeView1.Images :=SysSIcon;

    GetDomainList(TreeView1);

    end;



    procedure TForm1.Button1Click(Sender: TObject);

    begin





    if TreeView1.Selected <> nil then



    if TreeView1.Selected.level = 1 then



    GetServerList(TreeView1, TreeView1.Selected);





    end;



    procedure TForm1.TreeView1Expanding(Sender: TObject; Node: TTreeNode;

    var AllowExpansion: Boolean);

    begin

    if TreeView1.Selected.level = 1 then

    GetServerList(TreeView1, TreeView1.Selected);

    end;



    end.

  • Profile
    박태준 2001.04.06 20:59
    2000이어서 그런가요

    microsoft windows network 나오고 이걸 expand 하면

    소스 중에 메모리 어드레스 violation 에러가 나고

    워크 그룹은 검색 되네요.

    어쨌든 검색은 되니 감사합니다.

    근데 내컴퓨터가 어떤 그룹에 속해있는지 알아오는 방법은 없나요

    클릭해서 검색하는 거 말구요