游戏开发论坛

 找回密码
 立即注册
搜索
查看: 2669|回复: 0

如何枚举网络资源WXH ZT

[复制链接]

1367

主题

1993

帖子

2118

积分

金牌会员

Rank: 6Rank: 6

积分
2118
发表于 2005-1-12 22:24:00 | 显示全部楼层 |阅读模式
功能描述:
用户浏览网络确定或定位机器或共享资源是很常见的编程任务。下面提供一个函数是你能像资源管理器的树型分支那样枚举和展开网络资源

该函数的使用方法:
在项目中必须添加 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);   
}
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2024-12-23 16:18

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表