Исследуем сеть (WNetOpenEnum, WNetCloseEnum)

При программировании данной задачи в Windows 98 можно использовать функции Windows Networking (WNet), что мы с Вами и сделаем. Все начинается с функции WNetOpenEnum. Эта функция отрывает указатель, с помощью которого можно изучать сеть. Давайте ее посмотрим.

DWORD WNetOpenEnum
(
DWORD dwScope, // определяет возможности перечисления
DWORD dwType, // тип ресурса для перечисления
DWORD dwUsage, // тип использования для перечисления
LPNETRESOURCE lpNetResource, // структура для информации о ресурсу
LPHANDLE lphEnum // указатель на перечислитель
);

Давайте посмотрим параметры dwScope:

  • RESOURCE_CONNECTED - перечисляются все подключенные ресурсы, dwUsage игнорируется
  • RESOURCE_CONTEXT - перечисляются все ресурсы в контексте сети, dwUsage игнорируется
  • RESOURCE_GLOBALNET - перечисляются все ресурсы сети
  • RESOURCE_REMEMBERED - перечисляются все постоянные связи, dwUsage игнорируется

Следующий флаг - это dwType:

  • RESOURCETYPE_ANY - все ресурсы
  • RESOURCETYPE_DISK - все диски
  • RESOURCETYPE_PRINT - все принтеры

Флаг dwUsage используется только при перечислении всех ресурсов:

  • 0 - все ресурсы
  • RESOURCEUSAGE_CONNECTABLE - все подключенные ресусры
  • RESOURCEUSAGE_CONTAINER - все ресурсы контейнеры
  • RESOURCEUSAGE_ATTACHED - запрещает перечислять без аутентификации
  • RESOURCEUSAGE_ALL - объединяет флаги RESOURCEUSAGE_CONNECTABLE, RESOURCEUSAGE_CONTAINER и RESOURCEUSAGE_ATTACHED.

Если lpNetResource равен нулю, то для перечисления будет начинаться с самого верха сети. В другом случае этот параметр должен быть заполнен. При успешном выполнении функция вернет NO_ERROR.

После использования указатель на перечислитель lphEnum должен быть закрыт с помощью функции:

DWORD WNetCloseEnum
(
HANDLE hEnum // указатель на перечислитель
);

В случае успеха функция вернет NO_ERROR. Вот пример кода для начала перечисления.

void CEasyEnumNetResourceAbstract::OpenEnum()
{
dwResult = WNetOpenEnum(RESOURCE_GLOBALNET, RESOURCETYPE_ANY, 0, NULL, &hEnum);
if (dwResult != NO_ERROR)
throw CString("Error OpenEnum");
GetResource();
dwResult = WNetCloseEnum(hEnum);
if (dwResult != NO_ERROR)
throw CString("Error OpenEnum");
}

Все, что нужно здесь - это указатель на перечислитель:

class CEasyEnumNetResourceAbstract  
{
......
DWORD dwResult; // для результата
HANDLE hEnum; // указатель на ресурсы
LPNETRESOURCE netRc;
......
};

Функция GetResource специально сделана внутри функции OpenEnum для получения функционального замыкания. В этом классе она виртуальная и не имеем кода.