使用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();
现象:
第一次时弹出时对话框上只有一个网上邻居的图标,无法展开。
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();
重新修改了代码,能检查的都检查了,这个返回值是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();