Я разрабатываю расширение оболочки, которое создает новую папку. Мне бы хотелось, чтобы новая папка отображала набор настраиваемых столбцов в подробном представлении, когда пользователь просматривает ее. Я подумал, что, возможно, 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();
}
Этот код успешно выполняет каждый вызов метода, но когда я захожу во вновь созданную папку, столбцы не такие, как хотелось бы. Я делаю что-то неправильно? IColumnManager
работает только тогда, когда данная папка уже видна? Может быть, это только для IExplorerBrowser
или что-то? И если это не правильный интерфейс, как я могу установить набор настраиваемых столбцов, когда пользователь просматривает папку? Спасибо.
РЕДАКТИРОВАТЬ: этот код на самом деле работает в активном представлении папки. Однако изменения, вносимые в столбцы, не сохраняются (в отличие от изменений, внесенных пользователем вручную, которые сохраняются). Поэтому я думаю, мне интересно, есть ли способ заставить их сохраняться, или есть другой подход для установки столбцов без необходимости активного просмотра. Еще раз спасибо.
Кроме того, SHGetViewStatePropertyBag
может иметь значение? Вместе с IExplorerBrowser::SetPropertyBag
? Или их нельзя использовать для обычных папок оболочки?