我有一個文件夾(可能存在或已被刪除)的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