|
功能描述:
用户浏览网络确定或定位机器或共享资源是很常见的编程任务。下面提供一个函数是你能像资源管理器的树型分支那样枚举和展开网络资源
该函数的使用方法:
在项目中必须添加 mpr.lib 才能生成库文件,否则会报链接错误。添加方法是:
1、在 Visual C++ 6.0 环境中,通过 Project->Settings 菜单打开项目设置对话框。
2、选择 Link 标签,在 Catagory 下拉列表框中选择 General。
3、在 Object/library modules 栏输入 mpr.lib
下面函数从根启动一个网络枚举。如果你有一个指向 NETRESOURCE 的指针,可代替 NULL 指针以展开树型分支。
EnumNetwork( NULL, _T(" - ") );
枚举函数:
这是个实际的枚举函数。它首先打开网络资源,然后枚举之。每次都在 TRACE 中显示输出,函数自身可以重入。下面代码 EnumNetwork 自己调用自己展开分支。请在 DEBUG 环境中运行程序以便察看 TRACE 跟踪日志输出。
// 功能:
// 枚举给定的网络资源。
bool EnumNetwork( NETRESOURCE *const pNetResource, CString sIndent )
{
// TRACE( _T("EnumNetwork( %p )\n"), pNetResource );
//
// 开始
//
DWORD dwResult;
HANDLE hEnum;
DWORD cbBuffer = 16*1024;
DWORD cEntries = 0xFFFFFFFF;
LPNETRESOURCE lpnrDrv;
DWORD i;
dwResult = WNetOpenEnum(
pNetResource ? RESOURCE_GLOBALNET : RESOURCE_CONTEXT,
RESOURCETYPE_ANY,
0,
pNetResource,
&hEnum );
// 检查读取是否成功
if (dwResult != NO_ERROR)
{
TRACE( _T("%s *** 出错 %d - 无法枚举网络资源\n"),
sIndent, dwResult );
return false;
}
//
// 获取树型节点项目,直到最底层。
//
do
{
lpnrDrv = (LPNETRESOURCE) GlobalAlloc( GPTR, cbBuffer );
dwResult = WNetEnumResource( hEnum, &cEntries, lpnrDrv, &cbBuffer );
if (dwResult == NO_ERROR)
{
// 扫描结果
for( i = 0; i < cEntries; i++ )
{
CString sNameRemote = lpnrDrv.lpRemoteName;
if( sNameRemote.IsEmpty() )
{
sNameRemote = lpnrDrv.lpComment;
}
// 保存资源信息
TRACE( _T("%s %s\n"), sIndent, sNameRemote );
// 此处通过使用当前的 NETRESOURCE 调用自身进入纵深树型结构中。
// 不用操心分支共享问题,分支到最底层并可用 CFileFind 枚举。
if( lpnrDrv.dwDisplayType != RESOURCEDISPLAYTYPE_SHARE )
EnumNetwork( &(lpnrDrv), sIndent + _T(" ") );
}
}
GlobalFree( (HGLOBAL) lpnrDrv );
if( dwResult != ERROR_NO_MORE_ITEMS && dwResult != NO_ERROR )
{
TRACE( _T("%s *** 出错 %d - 无法完成网络资源枚举\n"),
sIndent, dwResult );
break;
}
}
while( dwResult != ERROR_NO_MORE_ITEMS );
//
// 结束
//
WNetCloseEnum(hEnum);
}
|
|