枚举网络资源

【勇芳软件工作室】汉化HomePreviousNext

要枚举网络容器资源,您的应用程序应将NETRESOURCE结构的地址传递给WNetOpenEnum功能。WNetOpenEnumNETRESOURCE结构描述的资源创建句柄。应用程序然后将此句柄传递给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;

}