![]() |
|
|||||||||||||||
| | 网站首页 | 局域网教程 | 软件说明书 | 深圳电脑城 | | ||
|
||
|
|||||
| 网络资源的列举 | |||||
作者:佚名 文章来源:不详 点击数: 更新时间: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条。评论内容只代表网友观点,与本站立场无关!) |
| | 设为首页 | 加入收藏 | 联系站长 | 友情链接 | 版权申明 | 网站公告 | | |||||
|