我正在开发一个创建新文件夹的 shell 扩展。我希望新文件夹在用户浏览后在详细信息 View 中显示一组自定义列。我认为IColumnManager
可能是实现此目的的正确接口(interface)。这是创建新文件夹后我要尝试的代码(我缩写为PKEY):
IShellFolder* psdf;
if (SUCCEEDED(SHGetDesktopFolder(&psdf))) {
PIDLIST_ABSOLUTE pidl = ILCreateFromPath(pwszNewFolderPath);
LPSHELLFOLDER psf;
if (SUCCEEDED(psdf->BindToObject(pidl, NULL, IID_IShellFolder, (void**)& psf))) {
SFV_CREATE sfvc = { 0 };
sfvc.cbSize = sizeof(SFV_CREATE);
sfvc.pshf = psf;
sfvc.psvOuter = NULL;
sfvc.psfvcb = NULL;
LPSHELLVIEW psv;
if (SUCCEEDED(SHCreateShellFolderView(&sfvc, &psv))) {
IColumnManager* pcm;
if (SUCCEEDED(psv->QueryInterface(IID_IColumnManager, (void**)& pcm))) {
PROPERTYKEY rgkeys[] = {
PKEY_ [...] ,
PKEY_ [...] ,
PKEY_ [...] ,
};
if (SUCCEEDED(pcm->SetColumns(rgkeys, ARRAYSIZE(rgkeys)))) {
//MessageBoxA(NULL, "Success?", "Success?", MB_OK);
}
pcm->Release();
}
psv->Release();
}
psf->Release();
}
psdf->Release();
}
这段代码成功执行了每个方法调用,但是当我进入新创建的文件夹时,这些列不是所期望的。难道我做错了什么?
IColumnManager
仅在给定文件夹已经可见时才起作用吗?也许仅适用于IExplorerBrowser
或其他?如果界面不正确,当用户浏览文件夹时,如何设置一组自定义列?谢谢。编辑:此代码实际上在该文件夹的 Activity View 上工作。但是,它对列所做的更改不会持久化(与用户手动进行的列更改一样,持久化确实如此)。所以我想我想知道是否有办法使它们持久化,或者是否还有另一种方法来设置列而不需要 Activity View 。再次感谢。
另外,
SHGetViewStatePropertyBag
可能相关吗?与IExplorerBrowser::SetPropertyBag
一起?还是不能将它们用于常规的Shell文件夹? 最佳答案
SHCreateShellFolderView
创建提供IShellView
的shell的实例,此接口(interface)知道如何保存其设置,但会向其IShellBrowser
主机请求存储实现。 IShellView::CreateViewWindow
将 View 连接到其主机。IShellView::SaveViewState
:
但是您需要实现IShellBrowser
并调用类似SHGetViewStatePropertyBag
的方法来获取资源管理器使用的存储实现,并在需要时将其提供给IShellView
。这里的大多数详细信息都没有记录,我建议您使用IExplorerBrowser
导航到该文件夹,而不是尝试自己托管IShellView
。使用“Shell”作为包装袋名称。
在Windows XP中添加了SHGetViewStatePropertyBag
,但那里不存在IExplorerBrowser
。如果需要支持the undocumented interface,它是IShellView
和SHGetViewStatePropertyBag
之间的粘合剂。
在Windows 2000和更早版本的Windows上,我认为状态直接存储在IStream
中而不是在属性包中。 OpenRegStream
用于打开流,但未记录计算MRU路径的函数,但KB 812003至少告诉您根目录。