zoukankan      html  css  js  c++  java
  • 枚举出局域网上所有网络资源

    MicroSoft提供了以下几个API:WnetOpenEnum、WnetEnumResource、WNetCloseEnum及一个结构类型NETRESOURCE用于搜索局域网上的网络资源。

    其中NETRESOURCE的定义如下:

    typedef struct _NETRESOURCE { // nr
     DWORD dwScope;
     DWORD dwType;
     DWORD dwDisplayType;
     DWORD dwUsage;
     LPTSTR lpLocalName;
     LPTSTR lpRemoteName;
     LPTSTR lpComment;
     LPTSTR lpProvider;
    } NETRESOURCE; 

    我们主要用到是dwType(资源类型:磁盘或打印机)、dwDisplayType(资源类型:服务器,域等)、dwUsage(判断是不是容器container)、lpRemoteName(资源名称)。

    WnetOpenEnum的作用是打开某一特定的资源容器句柄给WnetEnumResource。WnetEnumResource枚举出指定容器下所有网络资源。

    下面是一个列出所有网络资源的的函数示例:

    bool __fastcall TForm1::EnumerateFunc(HWND hwnd ,LPNETRESOURCE lpnr,TTreeNode * ParentNode)
    {
    DWORD dwResult, dwResultEnum;
    HANDLE hEnum;
    DWORD cbBuffer = 16384; /* 16K is reasonable size */
    DWORD cEntries = 0xFFFFFFFF; /* enumerate all possible entries */
    LPNETRESOURCE lpnrLocal; /* pointer to enumerated structures */
    DWORD i;
    dwResult = WNetOpenEnum(RESOURCE_GLOBALNET,
    RESOURCETYPE_ANY,
    0, /* enumerate all resources */
    lpnr, /* NULL first time this function is called */
    &hEnum); /* handle to resource */
    if (dwResult ==67) //domain下没有可访问的主机
    return true;
    if (dwResult != NO_ERROR ) { //无
    ShowError(dwResult);
    return false;
    }
    TTreeNode * Child;
    do {
    lpnrLocal = (LPNETRESOURCE) GlobalAlloc(GPTR, cbBuffer);

    dwResultEnum = WNetEnumResource(hEnum, /* resource handle */
    &cEntries, /* defined locally as 0xFFFFFFFF */
    lpnrLocal, /* LPNETRESOURCE */
    &cbBuffer); /* buffer size */

    if (dwResultEnum == NO_ERROR) {
    for(i = 0; i < cEntries; i++) {
    Child=TreeView1->Items->AddChild(ParentNode,lpnrLocal[i].lpRemoteName);
    if(RESOURCEUSAGE_c o nTAINER ==
    (lpnrLocal[i].dwUsage & RESOURCEUSAGE_c o nTAINER))
    if(!EnumerateFunc(this->Handle, &lpnrLocal[i],Child))
    ShowMessage("EnumerateFunc returned FALSE.");
    }
    }

    else if (dwResultEnum != ERROR_NO_MORE_ITEMS) {
    ShowError(dwResultEnum);
    break;
    }
    }
    while(dwResultEnum != ERROR_NO_MORE_ITEMS);
    GlobalFree((HGLOBAL) lpnrLocal);
    dwResult = WNetCloseEnum(hEnum);
    if(dwResult != NO_ERROR) {
    ShowError(dwResult);
    return FALSE;
    }
    return true;
    }

  • 相关阅读:
    A.3.1. 与MySQL客户端库的链接问题
    c++ mysqlclient library linkage problem Stack Overflow
    找房 爱合住, ihezhu.com
    21.4.5.1. MySQL Connector/C++ Connecting to MySQL
    如何对链接了mysqlclient的程序静态编译?
    分享:[组图] 科技圈最具权势 25 大女工程师
    linux 静态链接 mysql glibc 库的悲催过程 mango的日志 网易博客
    /usr/bin/ld: cannot find lgcc_s 问题解决小记
    « 静态编译的MySQL易挂起 »
    SQL C++代码自动生成器(sql2class)介绍 Newzai的专栏 博客频道 CSDN.NET
  • 原文地址:https://www.cnblogs.com/MaxWoods/p/348650.html
Copyright © 2011-2022 走看看