枚舉出局域網上所有網絡資源
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(判斷是不是容器c o ntainer)、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; } |
需要說明在win98下,此方法列出的資源和網絡鄰居列出的是一樣,和網絡鄰居一樣,有時列出的數據并不準確,可能會有一些域或機器不能找到。