Как вы используете SHCreateShellItemArrayFromDataObject в ShellExtInit :: Initialize? - PullRequest
0 голосов
/ 03 марта 2019

Документы говорят мне, что SHCreateShellItemArrayFromDataObject может быть более простым способом получить список файлов из DataObject, чем DataObject::GetFiles.Я хочу использовать функцию в ShellExtInit::Initialize, но не могу понять, как.

Мне нужен какой-то IShellItemArray, чтобы поместить результат, но это абстрактный класс, поэтому я не знаю, какопределить это.И SHCreateShellItemArrayFromDataObject последний аргумент должен быть типа void**, который я не знаю, как удовлетворить.

Как я могу исправить код?

HRESULT MyContextMenuHandler::Initialize(PCIDLIST_ABSOLUTE pidlFolder, IDataObject* pdtObj, HKEY hkeyProgId)
{
    [...]
    IShellItemArray items; // Class IShellItemArray is abstract
    HRESULT hr = SHCreateShellItemArrayFromDataObject(pdtObj, IID_IShellItemArray, &items); // Cannot convert to void**

1 Ответ

0 голосов
/ 03 марта 2019

Интерфейсы должны быть доступны только по указателям / ссылкам.В этом случае вам нужна переменная-указатель, и вы должны передать адрес этой переменной в SHCreateShellItemArrayFromDataObject() (с использованием приведения типа), чтобы он мог установить этот указатель на адрес IShellItemArray -определяющего объекта, для которого Shell создаетвы.Например:

HRESULT MyContextMenuHandler::Initialize(PCIDLIST_ABSOLUTE pidlFolder, IDataObject* pdtObj, HKEY hkeyProgId)
{
    ...
    IShellItemArray *items; // <-- pointer
    HRESULT hr = SHCreateShellItemArrayFromDataObject(pdtObj, IID_IShellItemArray, (void**)&items); // <-- type cast
    ... 
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...