VB 源码VC 源码ASP源码JSP源码PHP源码CGI源码FLASH源码素材模板C 源程序常用软件文档中心其他程序

网络应用

网站服务
邮件服务
网络应用
软件使用

本类阅读TOP10

·QQ骂人宝典(1)
·盗QQ密码高手FalseQQ
·邮箱及浏览器安全设置指南
·QQ骂人宝典(9)
·QQ骂人宝典(4)
·QQ骂人宝典(2)
·QQ骂人宝典(8)
·QQ骂人宝典(3)
·QQ骂人宝典(5)
·QQ骂人宝典(7)

精品推荐
网络资源的列举

作者:佚名 来源:月光软件站 加入时间:2005-3-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); //展开
}





相关文章

相关软件




月光软件程序下载编程文档电脑教程网站设计网址导航网络文学游戏天地幽默笑话生活休闲写作范文安妮宝贝
电脑技术编程开发网络专区谈天说地情感世界游戏元素分类游戏热门游戏体育运动手机专区业余爱好影视沙龙
音乐天地数码广场教育园地科学大观古今纵横谈股论金人文艺术医学保健动漫图酷二手专区地方风情各行各业

月光软件站·版权所有