在新目录上设置可见列

5 c++ com directory winapi multiple-columns

我正在开发一个创建新文件夹的外壳扩展。我希望新文件夹在用户浏览后在详细信息视图中显示一组自定义列。我认为这也许IColumnManager是完成此任务的正确接口。这是创建新文件夹后我正在尝试的代码(我缩写了 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();
}
Run Code Online (Sandbox Code Playgroud)

此代码成功执行了每个方法调用,但是当我进入新创建的文件夹时,这些列并不符合预期。难道我做错了什么?IColumnManager仅当给定文件夹已经可见时才起作用吗?也许只是为了IExplorerBrowser或者什么?如果它不是正确的界面,当用户浏览文件夹时如何设置一组自定义列?谢谢。

编辑:此代码实际上适用于文件夹的活动视图。但是,它对列所做的更改不会持续存在(与用户手动进行的列更改不同,后者会持续存在)。所以我想我想知道是否有一种方法可以让它们持续存在,或者是否有另一种方法可以在不需要活动视图的情况下设置列。再次感谢。

另外,可能SHGetViewStatePropertyBag相关吗?随着IExplorerBrowser::SetPropertyBag?或者这些不能用于常规 shell 文件夹吗?

And*_*ers 1

SHCreateShellFolderView创建所提供的 shell 的实例IShellView,并且该接口知道如何保存其设置,但它会向其IShellBrowser主机询问存储实现。IShellView::CreateViewWindow将视图连接到其宿主。

IShellView::SaveViewState:

保存 Shell 的视图设置,以便在后续浏览会话期间可以恢复当前状态。

但是您需要实现IShellBrowser并调用类似的方法SHGetViewStatePropertyBag来获取资源管理器使用的存储实现,并IShellView在它需要时将其提供给它。这里的大部分细节都没有记录,我建议您使用IExplorerBrowser导航到该文件夹​​,而不是尝试IShellView自行托管。使用“Shell”作为包名。

SHGetViewStatePropertyBagWindows XP 中已添加,但 Windows IExplorerBrowserXP 中不存在。如果您需要支持 <Vista,您必须调试 Explorer 以发现未记录的接口IShellView,它是和之间的粘合剂SHGetViewStatePropertyBag

在 Windows 2000 及更早版本上,我相信状态直接存储在IStream而不是属性包中。OpenRegStream用于打开流,但计算 MRU 路径的函数未记录,但KB 812003至少告诉您根。