2013-03-02 118 views
0

我有一个文件夹(可能存在或已被删除)的pidl,我可以用下面的代码得到一个IShellItem,但我需要的是该文件夹的创建日期。 我认为我可以用PKEY_DateCreated得到它,但我不知道如何。如何检索IShellItem的创建日期?

SHCreateShellItem(nil,nil,pidl,ShellItem); 

我该怎么做?

我使用Delphi。

+0

这不是Delphi的问题。这是一个纯粹的COM shell问题。 – 2013-03-02 17:29:15

+0

你把'IShellItem'绑定到'IShellFolder2'吗?还是你绑定到PIDL? – 2013-03-02 19:46:05

+0

经过调查,我改变了问题 – user382591 2013-03-02 20:03:16

回答

1

如果你有一个PIDL您可以使用SHGetDataFromIDList来获取对象的基本属性;你根本不需要IShellItem(或IShellItem2)。您将指定SHGDFIL_FINDDATAnFormat参数(有关详细信息,请参阅 http://msdn.microsoft.com/en-us/library/windows/desktop/bb762174(v=vs.85).aspx)。

这样做的好处在于,对于标准文件系统对象,元数据在PIDL中编码,所以即使对象不再存在,该函数也会返回有用的数据。

+0

看起来不错,但我只有一个绝对pidl而SHGetDataFromIDList需要一个IShellFolder和相对pidl。也许我可以得到他们,但如何? – user382591 2013-03-05 14:49:31

+0

请参阅'SHBindToParent'功能。您也可以尝试使用桌面文件夹作为其父母(通过“SHGetDesktopFolder”获取)传递绝对值,正如我发现的那样,即使不应该这样做也可以。 – 2013-03-05 19:57:57

2

纯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(); 
} 

而且大卫赫弗南指出,你是肯定的,那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 2013-03-03 17:22:56