Учитывая IShellItem*
, как я могу узнать его размер?
Оглядываясь вокруг, я увидел, что решение для этого может быть:
IShellItem2
к данному IShellItem
IShellItem
Я не совсем понимаю API Win32, поэтому, возможно, я все неправильно понял, но если я прав, мне просто трудно пройти 1-й шаг. Как я могу связать эти два?
Вам не нужно использовать IPropertyStore, если у вас есть ссылка IShellItem2, вы можете напрямую использовать IShellItem2::GetUInt64. Вот пример кода:
CoInitialize(NULL);
...
IShellItem2* item;
if (SUCCEEDED(SHCreateItemFromParsingName(L"c:\\myPath\\myFile.ext", NULL, IID_PPV_ARGS(&item))))
{
ULONGLONG size;
if (SUCCEEDED(item->GetUInt64(PKEY_Size, &size))) // include propkey.h
{
... use size ...
}
item->Release();
}
...
CoUninitialize();
Если у вас уже есть ссылка IShellItem
(как правило, вы хотите получить IShellItem2
напрямую) и хотите получить IShellItem2
, вы можете сделать это:
IShellItem2* item2;
if (SUCCEEDED(item->QueryInterface(&item2)))
{
... use IShellItem2 ...
}
Другой способ сделать это без использования IShellItem2
:
IShellItem* item;
if (SUCCEEDED(SHCreateItemFromParsingName(L"c:\\myPath\\myFile.ext", NULL, IID_PPV_ARGS(&item))))
{
IPropertyStore* ps;
if (SUCCEEDED(item->BindToHandler(NULL, BHID_PropertyStore, IID_PPV_ARGS(&ps))))
{
PROPVARIANT pv;
PropVariantInit(&pv);
if (SUCCEEDED(ps->GetValue(PKEY_Size, &pv))) // include propkey.h
{
ULONGLONG size;
if (SUCCEEDED(PropVariantToUInt64(pv, &size))) // include propvarutil.h
{
... use size ...
}
PropVariantClear(&pv);
}
ps->Release();
}
item->Release();
}
И как я могу получить IShellItem2 из IShellItem?
QueryInterface()
? Обычно это то, что вы должны делать в таких случаях.
@avi Базовое знакомство с компонентная объектная модель имеет решающее значение для любого программирования Shell.
Я определенно посмотрю на это, спасибо!
IShellItem2
происходит отIShellItem
, поэтому нет необходимости «привязыватьIShellItem2
к данномуIShellItem
». Вы можете вызыватьIShellItem::BindHandler()
(и другие методыIShellItem
) непосредственно вIShellItem2
.