zoukankan      html  css  js  c++  java
  • 枚举局域网中所有域的所有网络邻居

    ////////////////////////////////////////////////////////////////////////////////////////
    //用途:枚举网络邻居
    //参数:FirstEnum=1,开始枚举;如果返回TRUE,应该将这个参数置0,继续枚举直到返回FALSE
    //     Reserve=工作组或域名
    //返回:成功返回TRUE,属性NeighborName包含一个枚举出的网络邻居名称;
    //     没有新的网络邻居或方法失败返回FALSE.
    BOOL CCommunication::EnumNeighbor(long FirstEnum, LPCTSTR Reserve)
    {
    // TODO: Add your dispatch handler code here
    strLastError="";
    strNeighborName="";

    NETRESOURCE netResource;                                //当前枚举的结果内容
    HANDLE hEnum;                                           //枚举句柄
    DWORD dReturn;                                          //错误的返回码

    if(FirstEnum==1)                                        //第1次调用
    {
    NETRESOURCE nets;

    ZeroMemory(&nets,sizeof(NETRESOURCE));

    nets.lpRemoteName=(CHAR *)Reserve;
    nets.dwDisplayType=RESOURCEDISPLAYTYPE_SERVER;
    nets.dwUsage=RESOURCEUSAGE_CONTAINER;
    nets.dwScope=RESOURCETYPE_DISK;

    dReturn=WNetOpenEnum(RESOURCE_GLOBALNET,
    RESOURCETYPE_DISK,
    RESOURCEUSAGE_CONTAINER,
    &nets,
    &hEnum);

            if(dReturn!=NO_ERROR)
    {
    dReturn=::GetLastError();
    switch(dReturn)
    {
    case ERROR_EXTENDED_ERROR:
    strLastError="ERROR_EXTENDED_ERROR";
    return FALSE;
    case ERROR_NOT_CONTAINER:
    strLastError="ERROR_NOT_CONTAINER";
    return FALSE;
    case ERROR_INVALID_PARAMETER:
    strLastError="ERROR_INVALID_PARAMETER";
    return FALSE;
    case ERROR_NO_NETWORK:
    strLastError="ERROR_NO_NETWORK";
    return FALSE;
    }
    }

    DWORD dCount=0xfffffff;                            //枚举最多的项数
            DWORD dLen=16384;                                  //分配的枚举结果内存长度16k

    lpnetResource=(CHAR *)GlobalAlloc(GPTR,dLen);

    dCurNeighbor=0;
    dNeighborCount=0;

    do
    {
    dReturn=WNetEnumResource(hEnum,&dCount,lpnetResource,&dLen);
    if(dReturn==NO_ERROR)
    {
    dCurNeighbor=0;
    dNeighborCount=dCount;
    }
    else if(dReturn!=ERROR_NO_MORE_ITEMS)
    {
    WNetCloseEnum(hEnum);
    GlobalFree((HGLOBAL)lpnetResource);
            lpnetResource=NULL;
    strLastError="枚举网络邻居失败";
    return FALSE;
    }
    }while(dReturn!=ERROR_NO_MORE_ITEMS);
    WNetCloseEnum(hEnum);

    if(dNeighborCount==0)
    {
    GlobalFree((HGLOBAL)lpnetResource);
         lpnetResource=NULL;
    strLastError="没有一个主机";
    return FALSE;
    }

    CopyMemory(&netResource,lpnetResource+sizeof(NETRESOURCE)*dCurNeighbor,sizeof(NETRESOURCE));
    dCurNeighbor++;
    strNeighborName=netResource.lpRemoteName+2;  //获得连接在本机上主机的名称,+2是去掉主机名前的'\\'
    return TRUE;
    }
    else
    {
    if(lpnetResource==NULL)                                      
    {
    strLastError="第1次调用这个方法应该将第1个参数置1";
    return FALSE;
    }

    if(dCurNeighbor==dNeighborCount)
    {
    GlobalFree((HGLOBAL)lpnetResource);
         lpnetResource=NULL;
    return FALSE;
    }

        CopyMemory(&netResource,lpnetResource+sizeof(NETRESOURCE)*dCurNeighbor,sizeof(NETRESOURCE));
    dCurNeighbor++;
    strNeighborName=netResource.lpRemoteName+2;     //获得连接在本机上主机的名称
    return TRUE;
    }
    }

    ////////////////////////////////////////////////////////////////////////////////////////
    //用途:EnumNeighbor()枚举网络邻居成功后,返回枚举到的邻居名称
    BSTR CCommunication::GetNeighborName()
    {
    CString strResult;
    // TODO: Add your property handler here
    strResult=strNeighborName;

    return strResult.AllocSysString();
    }

    //废弃
    void CCommunication::SetNeighborName(LPCTSTR lpszNewValue)
    {
    // TODO: Add your property handler here
    }

    ////////////////////////////////////////////////////////////////////////////////////////
    //用途:EnumDomain()枚举工作组或域成功后,返回枚举到的工作组或域名称
    BSTR CCommunication::GetDomainName()
    {
    CString strResult;
    // TODO: Add your property handler here
    strResult=strDomain;

    return strResult.AllocSysString();
    }

    //废弃
    void CCommunication::SetDomainName(LPCTSTR lpszNewValue)
    {
    // TODO: Add your property handler here
    }

    ////////////////////////////////////////////////////////////////////////////////////////
    //用途:实际的枚举工作组或域
    //参数:netResource=网络类型
    //返回:成功返回TRUE,失败返回FALSE.
    BOOL CCommunication::EnumTheDomain(NETRESOURCE netResource)
    {
    HANDLE hEnum;                                           //枚举句柄
    DWORD dReturn;                                          //错误的返回码
    NETRESOURCE nets;                                       //当前枚举的结果内容

    //将要返回内容的结构清零
    ZeroMemory(&nets,sizeof(NETRESOURCE));

    //如果第一次枚举域和工作组dCurNeigborDm=0,dNeighborCountDm=0
    //或者是上一个网络类型中的域和工作组枚举结束,则枚举下一个网络类型中的域和工作组;
    //此时,netResource已经包含了下一个网络类型的信息
        if(dCurNeighborDm==dNeighborCountDm)
    {
    dReturn=WNetOpenEnum(RESOURCE_GLOBALNET,
    RESOURCETYPE_DISK,
    RESOURCEUSAGE_CONTAINER,
    &netResource,
    &hEnum);

            if(dReturn!=NO_ERROR)
    {
    dReturn=::GetLastError();
    switch(dReturn)
    {
    case ERROR_EXTENDED_ERROR:
    strLastError="ERROR_EXTENDED_ERROR";
    return FALSE;
    case ERROR_NOT_CONTAINER:
    strLastError="ERROR_NOT_CONTAINER";
    return FALSE;
    case ERROR_INVALID_PARAMETER:
    strLastError="ERROR_INVALID_PARAMETER";
    return FALSE;
    case ERROR_NO_NETWORK:
    strLastError="ERROR_NO_NETWORK";
    return FALSE;
    }
    }

    DWORD dCount=0xfffffff;                            //枚举最多的项数
            DWORD dLen=16384;                                  //分配的枚举结果内存长度16k

    lpnetResourceDm=(CHAR *)GlobalAlloc(GPTR,dLen);

    //必要的初始化
    dCurNeighborDm=0;
    dNeighborCountDm=0;

    do
    {
    dReturn=WNetEnumResource(hEnum,&dCount,lpnetResourceDm,&dLen);
    if(dReturn==NO_ERROR)
    {
    dCurNeighborDm=0;
    dNeighborCountDm=dCount;
    }
    else if(dReturn!=ERROR_NO_MORE_ITEMS)
    {
    WNetCloseEnum(hEnum);
    GlobalFree((HGLOBAL)lpnetResourceDm);
    lpnetResourceDm=NULL;
    strLastError="枚举工作组或域失败";
    return FALSE;
    }
    }while(dReturn!=ERROR_NO_MORE_ITEMS);
    WNetCloseEnum(hEnum);
    }

    if(dNeighborCountDm==0)
    {
    GlobalFree((HGLOBAL)lpnetResourceDm);
       lpnetResourceDm=NULL;
    return FALSE;
    }

    CopyMemory(&nets,lpnetResourceDm+sizeof(NETRESOURCE)*dCurNeighborDm,sizeof(NETRESOURCE));
    dCurNeighborDm++;
    strDomain=nets.lpRemoteName;    

    if(dCurNeighborDm==dNeighborCountDm)
    {
    GlobalFree((HGLOBAL)lpnetResourceDm);
       lpnetResourceDm=NULL;
    }

    return TRUE;
    }

    ////////////////////////////////////////////////////////////////////////////////////////
    //用途:枚举工作组或域
    //参数:FirstEnum=1,开始枚举;如果返回TRUE,应该将这个参数置0,继续枚举直到返回FALSE
    //     Reserve=保留
    //返回:成功返回TRUE,属性DomainName包含一个枚举出的工作组或域名称;
    //     没有新的工作组或域或方法失败返回FALSE.
    BOOL CCommunication::EnumDomain(long FirstEnum, LPCTSTR Reserve)
    {
    // TODO: Add your dispatch handler code here
    strLastError="";
    strDomain="";

        NETRESOURCE netResource;                                //当前枚举的网络类型的结果内容
    HANDLE hEnum;                                           //枚举句柄
    DWORD dReturn;                                          //错误的返回码

    if(FirstEnum==1)                                        //第1次调用
    {
    dReturn=WNetOpenEnum(RESOURCE_GLOBALNET,
    RESOURCETYPE_DISK,
    RESOURCEUSAGE_CONTAINER,
    NULL,
    &hEnum);

            if(dReturn!=NO_ERROR)
    {
    dReturn=::GetLastError();
    switch(dReturn)
    {
    case ERROR_EXTENDED_ERROR:
    strLastError="ERROR_EXTENDED_ERROR";
    return FALSE;
    case ERROR_NOT_CONTAINER:
    strLastError="ERROR_NOT_CONTAINER";
    return FALSE;
    case ERROR_INVALID_PARAMETER:
    strLastError="ERROR_INVALID_PARAMETER";
    return FALSE;
    case ERROR_NO_NETWORK:
    strLastError="ERROR_NO_NETWORK";
    return FALSE;
    }
    }

    DWORD dCount=0xfffffff;                            //枚举最多的项数
            DWORD dLen=16384;                                  //分配的枚举结果内存长度16k

    lpnetResourceNk=(CHAR *)GlobalAlloc(GPTR,dLen);

    dCurNeighborNk=0;
    dNeighborCountNk=0;

    do
    {
    dReturn=WNetEnumResource(hEnum,&dCount,lpnetResourceNk,&dLen);
    if(dReturn==NO_ERROR)
    {
    dCurNeighborNk=0;
    dNeighborCountNk=dCount;
    }
    else if(dReturn!=ERROR_NO_MORE_ITEMS)
    {
    WNetCloseEnum(hEnum);
    GlobalFree((HGLOBAL)lpnetResourceNk);
            lpnetResourceNk=NULL;
    strLastError="枚举网络类型失败";
    return FALSE;
    }
    }while(dReturn!=ERROR_NO_MORE_ITEMS);
    WNetCloseEnum(hEnum);

    if(dNeighborCountNk==0)
    {
    GlobalFree((HGLOBAL)lpnetResourceNk);
         lpnetResourceNk=NULL;
    return FALSE;
    }

    CopyMemory(&netResource,lpnetResourceNk+sizeof(NETRESOURCE)*dCurNeighborNk,sizeof(NETRESOURCE));
    dCurNeighborNk++;

    if(EnumTheDomain(netResource)==FALSE)
    goto GOONENUM;
    else
    return TRUE;
    }
    else
    {
    GOONENUM:

    if(lpnetResourceNk==NULL)                                      
    {
    strLastError="第1次调用这个方法应该将第1个参数置1";
    return FALSE;
    }

    //如果网络类型当前索引和总数相同并且域或工作组当前索引和总数相同
    if(dCurNeighborNk==dNeighborCountNk&&dCurNeighborDm==dNeighborCountDm)
    {
    GlobalFree((HGLOBAL)lpnetResourceNk);
         lpnetResourceNk=NULL;
    return FALSE;
    }

            //如果域或工作组当前索引和总数相同,则获取下一个网络类型的信息
    if(dCurNeighborDm==dNeighborCountDm)
    {
    CopyMemory(&netResource,lpnetResourceNk+sizeof(NETRESOURCE)*dCurNeighborNk,sizeof(NETRESOURCE));
        dCurNeighborNk++;
    }

    if(EnumTheDomain(netResource)==FALSE)
    goto GOONENUM;
    else
    return TRUE;
    }
    }
  • 相关阅读:
    KMP模板
    洛谷 [P2701] 巨大的牛棚
    浅谈用极大化思想解决最大子矩阵问题
    洛谷 [P1578] WC2002 奶牛浴场
    洛谷 [P1040]加分二叉树
    洛谷 [P1220] 关路灯
    清北学堂复习笔记
    一些比较实用的网站
    图论模板
    一些应该注意的问题
  • 原文地址:https://www.cnblogs.com/MaxWoods/p/348646.html
Copyright © 2011-2022 走看看