我有一个文件夹(可能存在或已被删除)的pidl,我可以用下面的代码得到一个IShellItem,但我需要的是该文件夹的创建日期。 我认为我可以用PKEY_DateCreated得到它,但我不知道如何。如何检索IShellItem的创建日期?
SHCreateShellItem(nil,nil,pidl,ShellItem);
我该怎么做?
我使用Delphi。
我有一个文件夹(可能存在或已被删除)的pidl,我可以用下面的代码得到一个IShellItem,但我需要的是该文件夹的创建日期。 我认为我可以用PKEY_DateCreated得到它,但我不知道如何。如何检索IShellItem的创建日期?
SHCreateShellItem(nil,nil,pidl,ShellItem);
我该怎么做?
我使用Delphi。
如果你有一个PIDL您可以使用SHGetDataFromIDList
来获取对象的基本属性;你根本不需要IShellItem
(或IShellItem2
)。您将指定SHGDFIL_FINDDATA为nFormat参数(有关详细信息,请参阅 http://msdn.microsoft.com/en-us/library/windows/desktop/bb762174(v=vs.85).aspx)。
这样做的好处在于,对于标准文件系统对象,元数据在PIDL中编码,所以即使对象不再存在,该函数也会返回有用的数据。
看起来不错,但我只有一个绝对pidl而SHGetDataFromIDList需要一个IShellFolder和相对pidl。也许我可以得到他们,但如何? – user382591 2013-03-05 14:49:31
请参阅'SHBindToParent'功能。您也可以尝试使用桌面文件夹作为其父母(通过“SHGetDesktopFolder”获取)传递绝对值,正如我发现的那样,即使不应该这样做也可以。 – 2013-03-05 19:57:57
纯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));
不错,但它不能在XP下工作,因为IShellItem2。任何解决方案 – user382591 2013-03-03 17:22:56
这不是Delphi的问题。这是一个纯粹的COM shell问题。 – 2013-03-02 17:29:15
你把'IShellItem'绑定到'IShellFolder2'吗?还是你绑定到PIDL? – 2013-03-02 19:46:05
经过调查,我改变了问题 – user382591 2013-03-02 20:03:16