网站公告列表

  没有公告

加入收藏
设为首页
联系站长
您现在的位置: 局域网DIY >> 局域网教程 >> 网管专区 >> [网络基础] >> 文章正文
  网络资源的列举          【字体:
网络资源的列举
作者:佚名    文章来源:不详    点击数:    更新时间:2005-10-1    

针对于局域网的编程中常常需要我们得到局域网上一些相关信息,本文即是用编程实现共享资源的列举

首先来看一下我们要用到的两个相关api函数:

◆dword wnetopenenum(

dword dwscope, // 指定列举范围
dword dwtype, // 列举资源的类型
dword dwusage, // 指定列举资源的使用情况
lpnetresource lpnetresource, // 指向netresource结构的指针,指定要列举的资源
lphandle lphenum //指向列举句柄,用在后面的wnetenumresource中
);

参数dwscope可以是下列值之一或其组合:

resource_connected 所有当前连接着的资源(将忽略dwusage参数)
resource_globalnet 所有的网络资源
resource_remembered 所有记住的(永久)连接(将忽略dwusage参数)

参数dwtype可以是下列值之一或其组合:

resourcetype_any 所有资源(不能与resourcetype_disk和resource_print组合)
resourcetype_disk 仅所有磁盘资源
resourcetype_print 仅所有打印资源

参数dwusage可以是下列值之一或其组合:

0 所有资源
resourceusage_connectable 所有可连接的资源
resourceusage_container 所有包容器资源

参数lpnetresource指向netresource结构,该结构指定了要列举的包容器(container),如果此参数为null则表示列举网络的根(root)

函数调用正确的话, 返回值为no_error,否则返回下列错误代码之一:

error_not_container 表示lpnetresource参数没有指向包容器
error_invalid_parameter dwscope或dwtype参数无效或参数组合错误
error_no_network 没有网络存在

◆dword wnetenumresource(

handle henum, // 列举句柄
lpdword lpccount, // 列举资源最大个数
lpvoid lpbuffer, // 指向接收列举结果的缓冲区,填充的实际是netresource结构数组的形式
lpdword lpbuffersize // 指向一个dword变量,该变量指出了lpbuffer的大小
);

这两个函数中都用到了一个重要的结构netresource,netresource结构如下:

typedef struct _netresourcea {
dword dwscope;// 指定列举范围
dword dwtype;// 列举资源的类型
dword dwdisplaytype;//网络对象展示给用户的类型
dword dwusage;// 指定列举资源的使用情况
lpstr lplocalname;//本地设备名
lpstr lpremotename;//远程设备名
lpstr lpcomment ;
lpstr lpprovider;//资源提供者的名字
}netresource;
参数dwdisplaytype可以是下列值之一:
resourcedisplaytype_domain 显示为一个domain
resourcedisplaytype_generic
resourcedisplaytype_server 显示为一个服务器
resourcedisplaytype_share 显示为一个共享资源

关于wnetenumresource的调用参数都很简单,这里就不再详细指出了,下面我们用编程实现列举所有网络资源,并将其填充到一个ttreeview中

首先打开c++builder创建一个新程序

然后在unit1.cpp的首部写入下面的函数:

bool __fastcall getnetres(ttreenodes *nodes,ttreenode * node, netresource * pnetresource, int depth)
{
//这是一个嵌套函数,其中nodes为指定tlistview实例的items,node为从指定节点扩展null为跟节点,pnetresource为列举根,
//depth为列//举深度,填入一个小于0的数,则深度为无穷,直到列举完毕
#define enumbufsize (16*1024)
#define enumcount 10
if (nodes==null) return false;
if (depth==0) return true;
handle henum;
bool revalue=true;
netresource *pnetres,netres;
if(wnetopenenum(resource_globalnet,resourcetype_any,0,pnetresource,&henum)!=no_error) return false;
char buf[enumbufsize];
dword ecount=enumcount;
dword esize=enumbufsize;
dword enumrst;
do{
enumrst=wnetenumresource(henum,&ecount,buf,&esize);
if (esize>enumbufsize) return false;
if (enumrst==no_error){
for (dword num=0;num pnetres=((netresource*)(buf+sizeof(netresource)*num));
ttreenode *tnode=nodes->addchild(node,ansistring(pnetres->lpremotename));
if (pnetres->dwdisplaytype!=resourcedisplaytype_share)
if(!getnetres(nodes,tnode,pnetres,depth-1)) revalue=false;
}
}
}while(ecount==enumcount);
if (enumrst!=error_no_more_items&&enumrst!=no_error) revalue=false;
wnetcloseenum(henum);
return revalue;
}

然后在tform1的formcreate事件中,写入代码,如下:

void __fastcall tform1::formcreate(tobject *sender)
{
caption="列举网络资源实例";
ttreeview *treeview1=new ttreeview(this);//创建一个ttreeview实例
treeview1->parent=this;
treeview1->left=10;
treeview1->top=10;
treeview1->width=clientwidth-20;
treeview1->height=clientheight-20;
if (!getnetres(treeview1->items,null,null,-1))//调用getnetres函数,从网络的根列举,并将数据添加到treeview1的根节点
showmessage("列举中出现了错误,可能是由一些资源的访问需要用户名和密码引起的!");
if (treeview1->items->item[0]!=null)
treeview1->items->item[0]->expand(false); //展开
}



文章录入:晨光    责任编辑:晨光 
  • 上一篇文章:

  • 下一篇文章:
  • 发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
    最新热点 最新推荐 相关文章
    利用RPR和MPLS提高MSTP网络效
    组播在MPLS VPN网络中的实现
    实施MPLS-VPN网络运营新商机
    Sniffer、黑客和网络管理
    网络监听软件 Sinffit 使用手
    Sniffer--会“抓毒”的网络分
    防范网络SNIFFER嗅探
    借助sniffer诊断Linux网络故
    借助sniffer诊断Linux网络故
    闻名业界的Sniffer网络管理解
      网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)

    局域网DIY】.版权所有 客服QQ:5820031 站长:晨光
    Copyright © 2000-2020 www.LANDIY.net All Rights Reserved
     


    粤ICP备05009256号