2012-05-04 2 views
3

Мне нужно отобразить окно свойств для определенных элементов: папки и файлы.Показать листы свойств для нескольких объектов оболочки

Для одного элемента отображения свойств окна очень просто - просто установите поле .lpFile. Но я не могу получить, как отображать окно свойств для нескольких элементов.

1) Перечисление файлов в .lpFile как "" file1.txt "" file2.txt "" и т. Д. Не работает. Даже если он работает, он неприменим, потому что список файлов может быть слишком большим.

2) Работа через PIDLIST_ABSOLUTE не принесла никаких результатов. Можно создать PIDLIST_ABSOLUTE для одного файла через ILCreateFromPath, но не может объединить несколько PIDLIST_ABSOLUTE в один.

У кого-нибудь есть обход? Любые ответы будут оценены

PS: Как я недавно понял, PIDLIST_ABSOLUTE уникально создан для конкретного уникального объекта. Таким образом, два или более PIDLIST_ABSOLUTE не могут быть объединены. Но вопрос все еще актуальный.

+0

Вы пытаетесь отобразить несколько окон свойств * одновременно *? Довольно уверен, что это не поддерживается. –

+0

Win32 embedded explorer имеет возможность отображать свойства нескольких выбранных элементов в одном окне свойств. Я хочу реализовать то же самое. – Orange

+2

Вызвать IShellFolder :: GetUIObjectOf, передать несколько pidls и запросить IContextMenu, а затем вызвать глагол свойств. –

ответ

0

Вызов IShellFolder :: GetUIObjectOf, пройти несколько pidls, и попросить IContextMenu, затем вызовите глагол «свойства. -. Raymond Chen

Спасибо, Рэймонд Он работает

!
0

самый простой способ в Дельфах:

Получить DataObject из IExplorerBrowser или из буфера обмена

if (OleGetClipboard(LDataObject) = S_OK) then 
    SHMultiFileProperties(LDataObject, 0); 

В противном случае используйте глагол «свойства»:

function TExplorerFrame.DoVerb(Verb: AnsiString): Boolean; 
var 
    LFolderView: IFolderView2; 
begin 
    Result := False; 
    if Supports(FCurrentShellView, IID_IFOLDERVIEW2, LFolderView) then 
    begin 
    if Verb = 'default' then 
     Result := (LFolderView.InvokeVerbOnSelection(nil) = S_OK) 
    else 
     Result := (LFolderView.InvokeVerbOnSelection(pAnsiChar(@Verb[1])) = S_OK); 
    end; 
end;