WNetEnumResource возвращает неполные результаты

Я написал программу, в которой перечислены общие сетевые объекты Windows, используя функции WNet. я заметил, что по какой-то причине функция WNetEnumResource извлекает только мои локальные ресурсы, хотя проводник видит гораздо больше объектов. Что может быть причиной этого? вот код:

    dwResult = WNetOpenEnum(RESOURCE_GLOBALNET, RESOURCETYPE_ANY,
        RESOURCEUSAGE_CONNECTABLE | RESOURCEUSAGE_CONTAINER, lpnr, &hEnum);
................
        dwResultEnum = WNetEnumResource(hEnum, &cEntries, lpnrLocal, &cbBuffer);

вот что я получил:

Microsoft Terminal Services network
Microsoft Windows Network   network
    WORKGROUP   domain
        \\MOSKKM    server
            \\MOSKKM\HP LaserJet 3055 PCL5  share
            \\MOSKKM\share  share
            \\MOSKKM\soft   share
            \\MOSKKM\tunnel share
Web Client Network  network

моя система Win7, я использую учетную запись администратора, и антивирусные программы или брандмауэры не работают. а также на виртуальной виртуальной машине VirtualBox, размещенной на той же машине, она работает корректно (однако в течение длительного времени). что может быть не так? может быть есть другие способы решить эту проблему, не используя функции WNet?

а также: WNetEnumResource отказывается от общих объектов, отсортированных по алфавиту. Я не могу представить какой-либо подход, как распараллелить этот процесс. есть идеи?

1 ответ

Я думаю, что вам нужно написать рекурсивную функцию для перечисления сетевых ресурсов,

Чтобы перечислить все сетевые ресурсы, приложение может начать перечисление, вызвав WNetOpenEnum с параметром lpNetResource, установленным в NULL, и затем использовать возвращенный дескриптор для вызова WNetEnumResource для перечисления ресурсов. Если один из ресурсов в массиве NETRESOURCE, возвращаемый функцией WNetEnumResource, является контейнерным ресурсом, вы можете вызвать WNetOpenEnum, чтобы открыть ресурс для дальнейшего перечисления. ( MSDN: WNetOpenEnum)

int EnumNetRes(NETRESOURCE *lpNetRes)

{

  DWORD dwResult;
  DWORD dwCount = -1;
  DWORD dwSize = sizeof(NETRESOURCE)*MAX_NET_RESOURCES;
  HANDLE hEnum;  

  dwResult = WNetOpenEnum(RESOURCE_GLOBALNET, RESOURCETYPE_ANY,
    RESOURCEUSAGE_CONNECTABLE | RESOURCEUSAGE_CONTAINER, lpNetRes, &hEnum);

  if(dwResult != NO_ERROR)
  {
       cerr << "WNetOpenEnum failed, error: " << dwResult << endl;
       //...
       return 1;
  }

 NETRESOURCE NetResources[MAX_NET_RESOURCES];  // #define MAX_NET_RESOURCES 1024
 dwResult = WNetEnumResource(hEnum, &dwCount, NetResource, dwSize);

 if(dwResult != NO_ERROR)
 {
     //...
     return 1;
 }


 for( int i=0; i<dwCount; i++){
      //...
      // retrieve of information about resource 
      //...

 if(NetResources[i].dwUsage & RESOURCEUSAGE_CONTAINER)
     EnumNetRes(&NetResources[i]);
 }

}

Другие вопросы по тегам