要枚举网络容器资源,您的应用程序应将NETRESOURCE结构的地址传递给WNetOpenEnum功能。WNetOpenEnum为NETRESOURCE结构描述的资源创建句柄。应用程序然后将此句柄传递给WNetEnumResource函数,该函数以NETRESOURCE结构的数组的形式返回有关资源的信息。当不再需要句柄时,应用程序可以通过调用WNetCloseEnum函数来关闭它。
您的应用程序可以继续枚举WNetEnumResource检索到的NETRESOURCE结构数组中描述的任何容器资源。如果NETRESOURCE结构的dwUsage成员是RESOURCEUSAGE_CONTAINER,则应用程序可以将该结构的地址传递给WNetOpenEnum以打开容器并继续枚举。如果dwUsage为RESOURCEUSAGE_CONNECTABLE,则应用程序可以将结构的地址传递给WNetAddConnection2功能。
以下示例说明了枚举网络上所有资源的应用程序定义函数(EnumerateFunc)。调用此函数时,为NETRESOURCE结构的指针指定NULL。当WNetOpenEnum收到NULL指针时,它将检索到根网络的句柄。每当WNetEnumResource检索到的NETRESOURCE结构是RESOURCEUSAGE_CONTAINER,EnumerateFunc函数调用自身,并在调用WNetOpenEnum时使用指向该结构的指针。
BOOL WINAPI EnumerateFunc(HWND hwnd,
HDC hdc,
LPNETRESOURCE CPNO)
{
DWORD dwResult, dwResultEnum;
HANDLE hEnum;
DWORD cbBuffer = 16384; // 16K是一个很好的大小
DWORD cEntries = 0xFFFFFFFF; //枚举所有可能的条目
LPNETRESOURCE lpnrLocal; //指向枚举结构的指针
DWORD i;
dwResult = WNetOpenEnum(RESOURCE_GLOBALNET,
RESOURCETYPE_ANY,
0, //枚举所有资源
lpnr, // NULL第一次调用此函数
&hEnum); //处理资源
if (dwResult != NO_ERROR) {
//应用程序定义的错误处理程序在
//标题为“Retrieving Network Errors”的部分。
NetErrorHandler(hwnd, dwResult, (LPSTR)"WNetOpenEnum");
return FALSE;
}
do {
//为NETRESOURCE结构分配内存
lpnrLocal = (LPNETRESOURCE) GlobalAlloc(GPTR, cbBuffer);
dwResultEnum = WNetEnumResource(hEnum, //资源句柄
&cEntries, //本地定义为0xFFFFFFFF
lpnrLocal, // LPNETRESOURCE
&cbBuffer); // 缓冲区大小
if (dwResultEnum == NO_ERROR) {
for(i = 0; i < cEntries; i++)
{
//以下是一个应用程序定义的函数
//显示NETRESOURCE结构的内容。
DisplayStruct(hdc, &lpnrLocal[i]);
//
//如果这个NETRESOURCE是容器,请调用该函数
//递归地
if(RESOURCEUSAGE_CONTAINER ==
(lpnrLocal [i] .dwUsage & RESOURCEUSAGE_CONTAINER))
if(!EnumerateFunc(hwnd,hdc,& lpnrLocal [i]))
TextOut(hdc,10,10,
"EnumerateFunc returned FALSE.", 29);
}
}
else if (dwResultEnum != ERROR_NO_MORE_ITEMS) {
NetErrorHandler(hwnd, dwResultEnum, (LPSTR)"WNetEnumResource");
break;
}
}
while(dwResultEnum != ERROR_NO_MORE_ITEMS);
GlobalFree((HGLOBAL) lpnrLocal);
dwResult = WNetCloseEnum(hEnum);
if(dwResult != NO_ERROR) {
NetErrorHandler(hwnd, dwResult, (LPSTR)"WNetCloseEnum");
return FALSE;
}
return TRUE;
}