2013-08-06 137 views
0

我編寫一個程序,使用WNet函數列出Windows網絡共享對象。我注意到,由於某種原因,WNetEnumResource函數只檢索我的本地共享,儘管資源管理器看到了更多的對象。這可能是什麼原因造成的? 這裏的代碼: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 VM上也能正常工作(但是,很長一段時間)。什麼可能是錯的?也許還有其他一些方法來解決這個問題,而不是使用WNet功能?

還有:WNetEnumResource放棄按字母排序的共享對象。我無法想象任何方法如何並行化這個過程。有任何想法嗎?

回答

0

我想你需要編寫遞歸函數來枚舉網絡資源,

枚舉所有的網絡資源,應用程序可以通過調用WNetOpenEnum設置爲NULL的lpNetResource參數開始枚舉,然後用返回的句柄調用WNetEnumResource來枚舉資源。如果由WNetEnumResource函數返回的NETRESOURCE數組中的資源之一是一個容器資源,則可以調用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]); 
} 

}

相關問題