Невозможно преобразовать аргумент из «LPITEMIDLIST *» в «LPCITEMIDLIST *» - PullRequest
0 голосов
/ 01 декабря 2018

Я пытаюсь создать функциональность, которая копирует несколько файлов с диалоговым окном по умолчанию.

Я нашел следующие примеры от Microsoft: FileOperationSample.cpp

Однако яполучить ошибку в этой строке:

IShellItemArray * psia;hr = SHCreateShellItemArray (NULL, psfSampleSrc, c_cMaxFilesToCreate, & rgpidlChildren [0], & psia);

        PITEMID_CHILD rgpidlChildren[c_cMaxFilesToCreate] = { 0 };

        for (UINT i = 0; SUCCEEDED(hr) && i < ARRAYSIZE(rgpidlChildren); i++)
        {
            WCHAR szSampleFileName[MAX_PATH];
            hr = StringCchPrintfW(szSampleFileName, ARRAYSIZE(szSampleFileName), L"%s%u.%s", c_szSampleFileName, i, c_szSampleFileExt);
            if (SUCCEEDED(hr))
            {
                hr = psfSampleSrc->ParseDisplayName(NULL, NULL, szSampleFileName, NULL, (PIDLIST_RELATIVE *)&rgpidlChildren[i], NULL);
            }
        }
        if (SUCCEEDED(hr))
        {
            IShellItemArray *psia;
            hr = SHCreateShellItemArray(NULL, psfSampleSrc, c_cMaxFilesToCreate, &rgpidlChildren[0], &psia);

Ответы [ 2 ]

0 голосов
/ 01 декабря 2018

Да, образцы от Microsoft иногда необходимо адаптировать к современным заголовкам из современных SDK.Обычно, чем более поздний SDK (из Visual Studio или нет) вы используете, тем строже компиляция.

Вы можете просто изменить объявление rgpidlChildren на (обратите внимание на 'C', для const):

PCITEMID_CHILD rgpidlChildren[c_cMaxFilesToCreate] = { 0 };
0 голосов
/ 01 декабря 2018

Пример кода компилируется без ошибок и предупреждений с VS2017.Однако, если я удаляю #define STRICT_TYPED_ITEMIDS, я получаю точно такую ​​же ошибку.

Решение:

Убедитесь, что ваш исходный код имеет #define STRICT_TYPED_ITEMIDS, прежде чем включать любые заголовки Windows, в идеале в начале предварительно скомпилированного заголовка (stdafx.h или pch.h, в зависимости от версии VS).

Справочная информация:

Если STRICT_TYPED_ITEMIDS не определено, из shtypes.h включены следующие определения:

#define PITEMID_CHILD LPITEMIDLIST              
#define PCUITEMID_CHILD_ARRAY LPCITEMIDLIST *

Таким образом, в этом случае SHCreateShellItemArray ожидает указатель на LPCITEMIDLIST для 4-го параметра, но вместо этого вы передаете ему указатель на LPITEMIDLIST, что несовместимо с ожидаемым типом.

Бонусная ссылка OldNewThing:

STRICT_TYPED_ITEMIDS - версия оболочки STRICT для пространства имен оболочки, используемая пользователем и GDI

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...