Windows 如何检索IShellItem的创建日期?

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)

我有一个文件夹的pidl(可能存在或已被删除)

我可以用下面的代码获取一个
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之前,它不可由第三方代码使用。