Как получить размер файла IShellItem?

Учитывая IShellItem*, как я могу узнать его размер?

Оглядываясь вокруг, я увидел, что решение для этого может быть:

  1. привязать IShellItem2 к данному IShellItem
  2. получить хранилище свойств IShellItem
  3. с эта функция (как показано в примере на странице), найдите размер файла

Я не совсем понимаю API Win32, поэтому, возможно, я все неправильно понял, но если я прав, мне просто трудно пройти 1-й шаг. Как я могу связать эти два?

IShellItem2 происходит от IShellItem, поэтому нет необходимости «привязывать IShellItem2 к данному IShellItem». Вы можете вызывать IShellItem::BindHandler() (и другие методы IShellItem) непосредственно в IShellItem2.
Remy Lebeau 10.04.2022 20:39
3 метода стилизации элементов HTML
3 метода стилизации элементов HTML
Когда дело доходит до применения какого-либо стиля к нашему HTML, существует три подхода: встроенный, внутренний и внешний. Предпочтительным обычно...
Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
1
1
36
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 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?

Avisrul156689 10.04.2022 16:03
QueryInterface()? Обычно это то, что вы должны делать в таких случаях.
Paul Sanders 10.04.2022 16:23

@avi Базовое знакомство с компонентная объектная модель имеет решающее значение для любого программирования Shell.

IInspectable 10.04.2022 16:52

Я определенно посмотрю на это, спасибо!

Avisrul156689 10.04.2022 17:01

Другие вопросы по теме