Windows 如何检索IShellItem的创建日期?
我有一个文件夹的pidl(可能存在或已被删除) 我可以用下面的代码获取一个Windows 如何检索IShellItem的创建日期?,windows,winapi,windows-shell,Windows,Winapi,Windows Shell,我有一个文件夹的pidl(可能存在或已被删除) 我可以用下面的代码获取一个IShellItem,但我需要的是获取该文件夹的创建日期。我想我可以通过PKEY\u DateCreated获得它,但我不知道如何获得它 SHCreateShellItem(nil, nil, pidl, ShellItem); 我该怎么做 我使用Delphi。纯Winapi示例: IShellItem2* pItem2 = NULL; hr = pItem->QueryInterface(&pItem2)
IShellItem
,但我需要的是获取该文件夹的创建日期。我想我可以通过PKEY\u DateCreated
获得它,但我不知道如何获得它
SHCreateShellItem(nil, nil, pidl, ShellItem);
我该怎么做
我使用Delphi。纯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();
}
正如David Heffernan所指出的,您确定所有的外壳项目都有创建日期吗
翻译成Delphi,看起来像这样:
var
Item: IShellItem;
Item2: IShellItem2;
ft: TFileTime;
st: TSystemTime;
....
Item2 := Item as IShellItem2;
OleCheck(Item2.GetFileTime(PKEY_DateCreated, ft));
Win32Check(FileTimeToSystemTime(ft, st));
纯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();
}
正如David Heffernan所指出的,您确定所有的外壳项目都有创建日期吗
翻译成Delphi,看起来像这样:
var
Item: IShellItem;
Item2: IShellItem2;
ft: TFileTime;
st: TSystemTime;
....
Item2 := Item as IShellItem2;
OleCheck(Item2.GetFileTime(PKEY_DateCreated, ft));
Win32Check(FileTimeToSystemTime(ft, st));
如果您有一个PIDL,您可以使用获取对象的基本属性;您根本不需要
IShellItem
(或IShellItem2
)。您可以为nFormat参数指定SHGDFIL_FINDDATA(请参见如果您有一个PIDL,您可以使用来获取对象的基本属性;您根本不需要IShellItem
(或IShellItem2
),您可以为nFormat参数指定SHGDFIL_FINDDATA(请参见获取创建日期。)
使用IShellItem2
IShellItem2
扩展了IShellItem
,添加了许多帮助器方法来从属性系统检索类型化属性
var
ft: FILETIME;
createdDate: TDateTime;
// IShellItem2 provides many handy helper methods to IShellItem
(shellItem as IShellItem2).GetFileTime(PKEY_DateCreated, {out}ft);
createdDate := FileTimeToDateTime(ft);
使用IShellItem
Windows Vista Windows XP添加了IShellItem
,它将[IShellFolder]
+[ITEMID\u CHILD]
封装到单个对象中。Windows Vista添加了丰富的属性系统,IPropertyStore
是一组属性的键值对(包括PKEY\u DateCreated
):
使用IShellFolder
IShellFolder
是Windows 95的原始界面。它只代表一个文件夹,您必须询问有关项目的信息(ITEMID\u CHILD
)在该文件夹中。在Vista之前没有创建PKEY_DateCreated
,因为属性系统在Vista之前不存在。但是文件和文件夹仍然有CreationTime
var
folder: IShellFolder;
parent: PIDLIST_ABSOLUTE;
child: PITEMID_CHILD;
findData: WIN32_FIND_DATA;
// We have an IShellItem that represents IShellFolder+ChildItemID.
// Ask the IShellItem to cough up its IShellFolder and child pidl
(shellItem as IParentAndItem).GetParentAndItem(parent, folder, child);
// Get the WIN32_FIND_DATA information associated with the child file/folder
SHGetDataFromIDList(folder, child, SHGDFIL_FINDDATA, findData, sizeof(findData));
createdDate := FileTimeToDateTime(findData.ftCreationTime);
获取创建日期
使用IShellItem2
IShellItem2
扩展了IShellItem
,添加了许多帮助器方法来从属性系统检索类型化属性
var
ft: FILETIME;
createdDate: TDateTime;
// IShellItem2 provides many handy helper methods to IShellItem
(shellItem as IShellItem2).GetFileTime(PKEY_DateCreated, {out}ft);
createdDate := FileTimeToDateTime(ft);
使用IShellItem
Windows Vista Windows XP添加了IShellItem
,它将[IShellFolder]
+[ITEMID\u CHILD]
封装到单个对象中。Windows Vista添加了丰富的属性系统,IPropertyStore
是一组属性的键值对(包括PKEY\u DateCreated
):
使用IShellFolder
IShellFolder
是Windows 95的原始界面。它只代表一个文件夹,您必须询问有关项目的信息(ITEMID\u CHILD
)在该文件夹中。在Vista之前没有创建PKEY_DateCreated
,因为属性系统在Vista之前不存在。但是文件和文件夹仍然有CreationTime
var
folder: IShellFolder;
parent: PIDLIST_ABSOLUTE;
child: PITEMID_CHILD;
findData: WIN32_FIND_DATA;
// We have an IShellItem that represents IShellFolder+ChildItemID.
// Ask the IShellItem to cough up its IShellFolder and child pidl
(shellItem as IParentAndItem).GetParentAndItem(parent, folder, child);
// Get the WIN32_FIND_DATA information associated with the child file/folder
SHGetDataFromIDList(folder, child, SHGDFIL_FINDDATA, findData, sizeof(findData));
createdDate := FileTimeToDateTime(findData.ftCreationTime);
这不是一个Delphi问题。这是一个纯COM shell问题。您是将
IShellItem
绑定到IShellFolder2
?还是绑定到PIDL?调查后,我改变了问题:如果文件夹已被删除,您如何获得任何信息?shell项是否有创建日期?或者这只是文件系统对象?这是这不是一个Delphi问题。这是一个纯COM shell问题。您是将IShellItem
绑定到IShellFolder2
?还是绑定到PIDLs?在调查之后,我改变了问题,如果文件夹已被删除,您如何获得任何信息?shell项是否有创建日期?或者这只是文件系统对象?很好,但我由于IShellItem2,在XP下不起作用。有解决方案吗?不错,但由于IShellItem2,在XP下不起作用。有解决方案吗?看起来不错,但我只有一个绝对pidl,而SHGetDataFromIDList需要一个IShellFolder和相对pidl。也许我可以获得它们,但如何获得?请参阅SHBindToParent
函数。您也可以尝试传递使用桌面文件夹作为其父文件夹的绝对值(通过SHGetDesktopFolder
获取)正如我发现的那样,即使不应该这样做,这通常也会起作用。这看起来不错,但我只有一个绝对pidl,而SHGetDataFromIDList需要一个IShell文件夹和相对pidl。也许我可以获得它们,但如何获得它们呢?请参阅SHBindToParent
函数。您也可以尝试使用桌面文件夹作为其父文件夹来传递绝对值(可通过SHGetDesktopFolder
获取)正如我发现的那样,即使不应该这样做,这通常也会起作用。虽然IShellItem在技术上是在XP SP0中为Explorer侧栏添加的,但在SP1或SP2之前,它不可由第三方代码使用。虽然IShellItem在技术上是在XP SP0中为Explorer侧栏添加的,但在SP1或SP2之前,它不可由第三方代码使用。