使用SHGetSpecialFolderLocation和SHBrowseForFolder来弹出网上邻居对话框。在XP下运行没有问题,但在Vista下却不太好使,很奇怪。
现象:
第一次时弹出时对话框上只有一个网上邻居的图标,无法展开。
Cancel掉以后再点击时所有的网上邻居全都正常显示了(似乎还和网络连接速度有关,如果前两次点击的间隔时间太短,有可能也不好使,要三次左右才能正常),以后怎么点击都正常。请各位大侠帮忙看看是啥原因?是Vista的安全设置太高,造成访问网上邻居速度慢,还是这个API跟操作系统相关?谢谢!!!相关代码如下:
LPITEMIDLIST pidl = NULL;
LPMALLOC pShellMalloc;
TCHAR disp[MAX_PATH];
memset(&disp, 0x0, sizeof(disp));
BROWSEINFO biBrowsInfo;
memset(&biBrowsInfo, 0x0, sizeof(biBrowsInfo));biBrowsInfo.hwndOwner = NULL; 
biBrowsInfo.pidlRoot = NULL;
biBrowsInfo.pszDisplayName = "test1";
biBrowsInfo.ulFlags = BIF_RETURNONLYFSDIRS;
biBrowsInfo.lpfn = NULL;
biBrowsInfo.lParam = 0;
biBrowsInfo.lpszTitle = "test1";if(SUCCEEDED(SHGetMalloc(&pShellMalloc)))
{
    HRESULT result = SHGetSpecialFolderLocation(NULL,CSIDL_NETWORK,&pidl);
if(pidl != NULL) {
biBrowsInfo.pidlRoot = pidl; 
}
LPITEMIDLIST lpItemList = SHBrowseForFolder(&biBrowsInfo);
pShellMalloc->Free(pidl);
}
pShellMalloc->Release(); 

解决方案 »

  1.   

    SHGetSpecialFolderLocation成功后会返回S_OK,判断一下看看,如果不是S_OK就再执行,直到成功
      

  2.   

    谢谢scz123。
    重新修改了代码,能检查的都检查了,这个返回值是S_OK。可能与这个没有关系。
    试着直接调用两次SHBrowseForFolder,那么根据网络速度,第二次调用有可能显示一个,两个或全部网络邻居. 这也说明了biBrowsInfo参数应该没有问题。更新的代码如下:
    TCHAR disp[MAX_PATH];
    memset(&disp, 0x0, sizeof(disp));
    BROWSEINFO biBrowsInfo = {0};memset(&biBrowsInfo, 0x0, sizeof(biBrowsInfo));
    biBrowsInfo.hwndOwner = hWnd; 
    biBrowsInfo.pidlRoot = NULL;
    biBrowsInfo.pszDisplayName = disp;
    biBrowsInfo.ulFlags = BIF_RETURNONLYFSDIRS;
    biBrowsInfo.lpfn = NULL;
    biBrowsInfo.lParam = 0;
    biBrowsInfo.lpszTitle = "test1";if(SUCCEEDED(SHGetMalloc(&pShellMalloc)))
    {
         HRESULT result = SHGetSpecialFolderLocation(hWnd,CSIDL_NETWORK,&pidl) if(S_OK != result){
    MessageBox(NULL,"SHGetSpecialFolderLocation_error",MB_OK);
    } if(pidl != NULL) {
    biBrowsInfo.pidlRoot = pidl; 
    } lpItemList = SHBrowseForFolder(&biBrowsInfo); lpItemList = SHBrowseForFolder(&biBrowsInfo); //第二次调用,可能正确显示。
    pShellMalloc->Free(pidl);}
    pShellMalloc->Release();
      

  3.   

    建议你查看在线msdn,最新的sdk已经有了