通过SHCreateShellFolderView中获取XP桌面的IShellView

张阿飞 2018-06-27 12:20:49
 
IShellFolder *psf;
if (SUCCEEDED(SHGetDesktopFolder(&psf)))
{
OutputDebugStringA("into SHGetDesktopFolder");
IShellView* psve;
SFV_CREATE sfv;
sfv.cbSize = sizeof(SFV_CREATE);
sfv.psfvcb = NULL;
sfv.pshf = psf;
sfv.psvOuter = NULL; /**/
if (SUCCEEDED(SHCreateShellFolderView(&sfv, (IShellView**)&psve)))
{
OutputDebugStringA("into CreateViewObject");
IEnumIDList* pedl;
LPITEMIDLIST pidlItem;
if (SUCCEEDED(psf->EnumObjects(hExplorer, SHCONTF_NONFOLDERS, &pedl)))
{
OutputDebugStringA("into pedl");
int index = 0;
do
{
int bindex = 0;
STRRET str;
pedl->Next(index++, &pidlItem, (ULONG*)&bindex);
if (SUCCEEDED(psf->GetDisplayNameOf(pidlItem, SHGDN_FORPARSING, &str)))
{

TCHAR szItem[MAX_PATH];
StrRetToBuf(&str, pidlItem, szItem, MAX_PATH);
if (isReviseFile(szItem))
{
OutputDebugString(szItem);
psve->SelectItem(pidlItem, SVSI_DESELECT);

}
}
} while (pidlItem != NULL);
}
psve->Release();
}
psf->Release();
}
...全文
1100 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
这个是创建的新的并不是已有桌面的。我也为这个问题困扰了很久。。。
蒋晟 2018-07-01
  • 打赏
  • 举报
回复
Vista开始桌面可以用IShellWindows访问。
XP下桌面没有API,你可以查桌面上是不是有SysListView32 窗口,如果是的话,那么有大概率是桌面那个defview,这个在XP下item data是pidl,但是注意用户是可以自己用Active Desktop在桌面上放别的defview窗口的。
蒋晟 2018-06-28
  • 打赏
  • 举报
回复
你这是自己创建了一个新的shell view(类似自己写了个资源管理器),你的代码对桌面并不会有影响,这是设计行为。
张阿飞 2018-06-28
  • 打赏
  • 举报
回复
引用 8 楼 jiangsheng 的回复:
你这是自己创建了一个新的shell view(类似自己写了个资源管理器),你的代码对桌面并不会有影响,这是设计行为。

我在msdn上看 IShellFolder ::CreateViewObject能创建系统的ishellview 是不是有什么条件 我这种方法创建的还是对桌面没有什么影响
To support this request, create an object that exposes the interface indicated by riid and return a pointer to that interface.

The primary purpose of this method is to provide Windows Explorer with the folder object's folder view object. Windows Explorer requests a folder view object by setting riid to IID_IShellView. The folder view object displays the contents of the folder in the Windows Explorer folder view. The folder view object must be independent of the Shell folder object, because Windows Explorer may call this method more than once to create multiple folder view objects. A new view object must be created each time this method is called. Your folder object can respond in one of two ways to this request. It can:

Create a custom folder view object and return a pointer to its IShellView interface.
Create a system folder view object and return a pointer to its IShellView interface.
张阿飞 2018-06-28
  • 打赏
  • 举报
回复
引用 8 楼 jiangsheng 的回复:
你这是自己创建了一个新的shell view(类似自己写了个资源管理器),你的代码对桌面并不会有影响,这是设计行为。
这么说的话 IShellFolder *psf;
psf->CreateViewObject(hExplorer, IID_IShellView, (void**)&psve)
通过种方式创建的shellview也是自定义的 不能操作桌面上的文件
张阿飞 2018-06-28
  • 打赏
  • 举报
回复
引用 8 楼 jiangsheng 的回复:
你这是自己创建了一个新的shell view(类似自己写了个资源管理器),你的代码对桌面并不会有影响,这是设计行为。
哇 真是茅塞顿开 不知道怎么获取桌面上的ishellview呢
张阿飞 2018-06-27
  • 打赏
  • 举报
回复

虽然ishellview不是NULL但是执行这代码没有效果
psve->SelectItem(pidlItem, SVSI_DESELECT);
张阿飞 2018-06-27
  • 打赏
  • 举报
回复
顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶
张阿飞 2018-06-27
  • 打赏
  • 举报
回复
不要沉啊
张阿飞 2018-06-27
  • 打赏
  • 举报
回复
引用 4 楼 zhao4zhong1 的回复:
GetLastError ?
getlasterror()返回值是0,真是闹不明白啊
赵4老师 2018-06-27
  • 打赏
  • 举报
回复
GetLastError ?
张阿飞 2018-06-27
  • 打赏
  • 举报
回复
引用 2 楼 zhao4zhong1 的回复:
权限问题 ?
我这是在COM组件里面写的 通过regsvr32注册了的 系统自动加载到资源管理器,有点不明白权限问题是怎么回事
赵4老师 2018-06-27
  • 打赏
  • 举报
回复
权限问题 ?

3,245

社区成员

发帖
与我相关
我的任务
社区描述
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
  • ATL/ActiveX/COM社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧