Исследуем сеть (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 для получения функционального замыкания. В этом классе она виртуальная и не имеем кода.