2013-03-02 8 views
0

У меня есть папка (которая может существовать или была удалена), я могу получить IShellItem со следующим кодом, но мне нужно получить дату создания этой папки. Я предполагаю, что могу получить его с PKEY_DateCreated, но я не знаю, как это сделать.Как получить дату создания IShellItem?

SHCreateShellItem(nil,nil,pidl,ShellItem); 

Как это сделать?

Я использую Delphi.

+0

Это не вопрос Дельфы. Это чистый вопрос оболочки COM. –

+0

Вы связываете 'IShellItem' с' IShellFolder2'? Или вы связываетесь с PIDL? –

+0

После расследования я изменил вопрос – user382591

ответ

1

Если у вас есть PIDL вы можете использовать SHGetDataFromIDList, чтобы получить основные атрибуты объекта; вам не нужен IShellItem (или IShellItem2). Вы должны указать SHGDFIL_FINDDATA для параметра nFormat (см. http://msdn.microsoft.com/en-us/library/windows/desktop/bb762174(v=vs.85).aspx).

Приятно то, что для стандартных объектов файловой системы метаданные кодируются в самом PIDL, поэтому функция возвращает полезные данные, даже если объект больше не существует.

+0

Кажется приятным, но у меня только абсолютный pidl, тогда как SHGetDataFromIDList нуждается в IShellFolder и относительном pidl. Может быть, я могу получить их, но как? – user382591

+0

См. Функцию 'SHBindToParent'. Вы также можете попробовать передать абсолютное значение с помощью папки рабочего стола в качестве родительского элемента (который вы получаете через 'SHGetDesktopFolder'), поскольку я обнаружил, что это часто работает, даже если это не предполагается. –

2

Pure WinAPI Пример:

IShellItem2* pItem2 = NULL; 
hr = pItem->QueryInterface(&pItem2); 
if (SUCCEEDED(hr)) 
{ 
    FILETIME ft = {0}; 
    pItem2->GetFileTime(PKEY_DateCreated, &ft); 
    SYSTEMTIME st = {0}; 
    ::FileTimeToSystemTime(&ft, &st); 
    wprintf(
     L"Date Created: %04d-%02d-%02d %02d:%02d:%02d\n", 
     st.wYear, st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond); 
    pItem2->Release(); 
} 

Кроме того, как отметил Дэвид Heffernan, вы уверены, что ALL элементы оболочки имеют даты создания?

В переводе на Delphi, которая будет выглядеть примерно так:

var 
    Item: IShellItem; 
    Item2: IShellItem2; 
    ft: TFileTime; 
    st: TSystemTime; 
.... 
Item2 := Item as IShellItem2; 
OleCheck(Item2.GetFileTime(PKEY_DateCreated, ft)); 
Win32Check(FileTimeToSystemTime(ft, st)); 
+0

Приятный, но он не работает под XP из-за IShellItem2. Любое решение? – user382591

Смежные вопросы