|
| БЕСПЛАТНАЯ ежедневная online лотерея! Выигрывай каждый день БЕСПЛАТНО! |
|
|
Enumerating Network Resources
To enumerate a network container resource, your application should pass the address of a NETRESOURCE structure to the WNetOpenEnum function. WNetOpenEnum creates a handle to the resource described by the NETRESOURCE structure. The application then passes this handle to the WNetEnumResource function, which returns information about the resource in the form of an array of NETRESOURCE structures. When the handle is no longer needed, the application can close it by calling the WNetCloseEnum function.
Your application can continue enumerating any container resource described in the array of NETRESOURCE structures retrieved by WNetEnumResource. If the dwUsage member of the NETRESOURCE structure is RESOURCEUSAGE_CONTAINER, the application can pass the address of that structure to WNetOpenEnum to open the container and continue the enumeration. If dwUsage is RESOURCEUSAGE_CONNECTABLE, the application can pass the structure's address to the WNetAddConnection2 function.
The following example illustrates an application-defined function (EnumerateFunc) that enumerates all the resources on a network. When calling this function, specify NULL for the pointer to the NETRESOURCE structure. When WNetOpenEnum receives the NULL pointer, it retrieves a handle to the root of the network. Whenever a NETRESOURCE structure retrieved by WNetEnumResource is RESOURCEUSAGE_CONTAINER, the EnumerateFunc function calls itself and uses a pointer to that structure in its call to WNetOpenEnum.
BOOL WINAPI EnumerateFunc(HWND hwnd, HDC hdc, LPNETRESOURCE lpnr) { DWORD dwResult, dwResultEnum; HANDLE hEnum; DWORD cbBuffer = 16384; // 16K is a good 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 != NO_ERROR) { // An application-defined error handler is demonstrated in the // section titled "Retrieving Network Errors."
NetErrorHandler(hwnd, dwResult, (LPSTR)"WNetOpenEnum"); return FALSE; } do { // Allocate memory for NETRESOURCE structures.
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++) { // Following is an application-defined function for
// displaying contents of NETRESOURCE structures. DisplayStruct(hdc, &lpnrLocal[i]); // // If this NETRESOURCE is a container, call the function // recursively.
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; }
| Пригласи друзей и счет твоего мобильника всегда будет положительным! |
| Пригласи друзей и счет твоего мобильника всегда будет положительным! |
Перечисляющие Сетевые Ресурсы
Чтобы перечислять сетевой контейнерный ресурс, ваше приложение должно передавать адрес структуры NETRESOURCE в функцию WNetOpenEnum. WNetOpenEnum СОЗДАЕТ ручку в ресурс описанный структурой NETRESOURCE. Приложение затем передает эту ручку в функцию WNetEnumResource, какая информация возврата о ресурсе в форме массива структур NETRESOURCE. Когда ручка не - больше не нужно, приложение может закрыть это вызывая функцию WNetCloseEnum.
Ваше приложение может продолжить перечислять любой контейнерный ресурс описанный в массиве структур NETRESOURCE извлеченных WNetEnumResource. Если элемент dwUsage структуры NETRESOURCE - RESOURCEUSAGE_CONTAINER, приложение может передать адрес этой структуры на WNetOpenEnum, чтобы открывать контейнер и продолжать перечисление. Если dwUsage - RESOURCEUSAGE_CONNECTABLE, приложение может передать структурный адрес в функцию WNetAddConnection2.
Следующий пример иллюстрирует определенную прикладную функцию (EnumerateFunc), что перечисляет все ресурсы в сети. При вызове этой функции, определите НЕДЕЙСТВИТЕЛЬНЫЙ для указателя в структуру NETRESOURCE. Когда WNetOpenEnum получает НЕДЕЙСТВИТЕЛЬНЫЙ указатель, это извлекает ручку в корень сети. Всякий раз, когда структура NETRESOURCE извлеченная WNetEnumResource - RESOURCEUSAGE_CONTAINER, функциональные вызовы EnumerateFunc сам и использует указатель в эту структуру на своем вызове на WNetOpenEnum.
BOOL WINAPI EnumerateFunc(HWND hwnd, HDC hdc, LPNETRESOURCE lpnr) { DWORD dwResult, dwResultEnum; ПРООПЕРИРУЙТЕ hEnum; DWORD cbBuffer = 16384; // 16K - хороший размер DWORD cEntries = 0xFFFFFFFF; // перечислите все возможные данные LPNETRESOURCE lpnrLocal; // указатель на перечислял i структур DWORD; dwResult = WNetOpenEnum(RESOURCE_GLOBALNET, RESOURCETYPE_ANY,
0, // перечислять все ресурсы lpnr, // НЕДЕЙСТВИТЕЛЬНАЯ сначала эта функция названа &hEnum); // ручка в ресурс если (dwResult != NO_ERROR) { // Определенный прикладной вручитель ошибки продемонстрирован в // секции назвавшей "Сетевые Ошибки Поиска."
NetErrorHandler(hwnd, dwResult, (LPSTR)"WNetOpenEnum"); обратная ЛОЖЬ; } сделайте { // Распределите память для структур NETRESOURCE.
lpnrLocal = (LPNETRESOURCE) GlobalAlloc(GPTR, cbBuffer); dwResultEnum = WNetEnumResource(hEnum, // РУЧКА ресурса &cEntries, // определенное локально как 0xFFFFFFFF lpnrLocal, // LPNETRESOURCE &cbBuffer); // буферный размер если (dwResultEnum == NO_ERROR) { для(i = 0; я < cEntries; я++) { // Следующее является определенной прикладной функцией для
// отображающее содержание структур NETRESOURCE. DisplayStruct(hdc, &lpnrLocal[i]); // // Если это NETRESOURCE - контейнер, назовите функцию // рекурсивно.
если(RESOURCEUSAGE_CONTAINER == (lpnrLocal[i].dwUsage & RESOURCEUSAGE_CONTAINER)) если(!EnumerateFunc(hwnd, hdc, &lpnrLocal[i])) TextOut(hdc, 10, 10,
"EnumerateFunc ВОЗВРАЩАВШЕЕ FALSE.", 29); } } еще если (dwResultEnum != ERROR_NO_MORE_ITEMS) { NetErrorHandler(hwnd, dwResultEnum, (LPSTR)"WNetEnumResource"); прерывание; } } пока(dwResultEnum != ERROR_NO_MORE_ITEMS); GlobalFree((HGLOBAL) lpnrLocal); dwResult = WNetCloseEnum(hEnum); если(dwResult!= NO_ERROR) { NetErrorHandler(hwnd, dwResult, (LPSTR)"WNetCloseEnum");
обратная ЛОЖЬ; } возвращайтесь ВЕРНО; }
|
|
|
|
| |