-
您的位置:首页 → 网络冲浪 → 网络技术 → 网络资源的列举
网络资源的列举
时间:2004/10/8 16:46:00来源:本站整理作者:蓝点我要评论(0)
-
针对于局域网的编程中常常需要我们得到局域网上一些相关信息,本文即是用编程实现共享资源的列举
首先来看一下我们要用到的两个相关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); //展开
}
相关阅读
Windows错误代码大全 Windows错误代码查询激活windows有什么用Mac QQ和Windows QQ聊天记录怎么合并 Mac QQ和Windows QQ聊天记录Windows 10自动更新怎么关闭 如何关闭Windows 10自动更新windows 10 rs4快速预览版17017下载错误问题Win10秋季创意者更新16291更新了什么 win10 16291更新内容windows10秋季创意者更新时间 windows10秋季创意者更新内容kb3150513补丁更新了什么 Windows 10补丁kb3150513是什么
-
热门文章
小米路由器设置教程附共享有线路由后再接无TP-link无线路由器设置D-Link DI-524M路由器
最新文章
百度网盘解除黑名单摆百度不收录怎么办 百度
10款免费开源图表插件推荐ssid隐藏了怎么办?隐藏SSID的无线网络如何OneDNS设置教程两块网卡访问不同网络案例分享
人气排行
宽带连接图标不见了怎么办 宽带连接图标怎么dell 服务器开机总是提示按F1才能进系统解决dns是什么?dns怎么设置?buffalo无线路由器设置图文教程哪种WIFI无线各种加密方式更安全?ADSL宽带连接错误(720)及解决方法双网卡同时上内外网设置教程公司网络综合布线图解
查看所有0条评论>>