2013-03-02 59 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