Значение общего столбца неправильно отображается в расширении пространства имен оболочки

Я использую расширение пространства имен оболочки для создания виртуальной папки в Windows 7. Я хочу добавить столбцы в эту виртуальную папку, чтобы она могла отображать сведения о виртуальных файлах. Однако значение «Shared» не может отображаться правильно. Вот соответствующий код:

else if (IsEqualPropertyKey(*pkey, PKEY_IsShared))
    {
        if (cch)
        {
            hr = StringCchCopy(pszRet, cch, L"");
        }
        else
        {
            pv->vt = VT_BOOL;

            BOOL isShared;
            GetIsShared(pidl, isShared);

            VARIANT_BOOL shared;

            if (isShared) shared = VARIANT_TRUE;//I add breakpoint here, it works
            else shared = VARIANT_FALSE;

            pv->pboolVal = &shared;

            hr = pv->pboolVal ? S_OK : E_OUTOFMEMORY;
        }
    }

Приведенный выше код находится в функции IFACEMETHODIMP GetDetailsEx(PCUITEMID_CHILD pidl, const PROPERTYKEY *pkey, VARIANT *pv);, которая является интерфейсом, предоставляемым Windows. введите здесь описание изображения Я добавляю точки останова в приведенный выше код, оказывается, когда переменная isShared равна true, переменная shared становится VARIANT_TRUE. Однако, когда я проверяю значение, отображаемое в пользовательском интерфейсе, оно отображает no для всех объектов: введите описание изображения здесь Как видите, в столбце "Shared" все значение равно " нет". На самом деле, первые 3 файла являются общими, и они должны быть «да». когда отладчик достигает точки останова в приведенном выше коде, значение для этих трех файлов равно VARIANT_TRUE. Вот определение WINDOWS для PKEY_IsSahred

//  Name:     System.IsShared -- PKEY_IsShared
 //  Type:     Boolean -- VT_BOOL
//  FormatID: {EF884C5B-2BFE-41BB-AAE5-76EEDF4F9902}, 100
//
//  Is this item shared?  This only checks for ACLs that are not inherited.
DEFINE_PROPERTYKEY(PKEY_IsShared, 0xEF884C5B, 0x2BFE, 0x41BB, 0xAA, 0xE5, 0x76, 0xEE, 0xDF, 0x4F, 0x99, 0x02, 100);

Я также попытался отредактировать приведенный выше код, например:

if (isShared) shared = (VARIANT_BOOL)1;
else shared = (VARIANT_BOOL)0;

Это не работает. Если я заменю pv->pboolVal = &shared; на pv->boolVal= shared;, он будет работать следующим образом:  введите здесь описание изображения Отображать" Да "только для трех верхних файлов.

Если я использую VARIANT_TRUE, VARIANT_FALSE и pv->boolVal, отображается только «Да».

pv->vt = VT_BOOL;

            BOOL isShared;
            GetIsShared(pidl, isShared);

            VARIANT_BOOL shared;

            if (isShared)
            {
                shared = VARIANT_TRUE;
                pv->boolVal = shared;
            }
            else
            {
                shared = VARIANT_FALSE;
                pv->boolVal= shared;
            }           

            hr = pv->boolVal ? S_OK : E_OUTOFMEMORY;

----- Рабочее обновление -------------------

if (isShared)
            {
                shared = VARIANT_TRUE;
                pv->boolVal = shared;
            }
            else
            {
                shared = VARIANT_FALSE;
                pv->boolVal = shared;
            }           

            hr = S_OK;

Этот работает для меня!


person beasone    schedule 12.05.2018    source источник
comment
Почему вы используете pboolVal? вы должны использовать boolVal   -  person Simon Mourier    schedule 12.05.2018
comment
@SimonMourier Вы видите мои обновления? Когда я использую boolVal, отображается второй снимок экрана. (Отображать только с Да)   -  person beasone    schedule 14.05.2018


Ответы (1)


Вы не должны использовать здесь член pboolVal, и назначение указателя на что-то в стеке, безусловно, не является правильным. Тип должен быть VT_BYREF|VT_BOOL, чтобы использовать pboolVal, но в этом случае нет смысла делать это, и у вас нет памяти, на которую можно указать.

Просто используйте boolVal и VARIANT_TRUE / FALSE.

person Anders    schedule 12.05.2018
comment
Вы видите мои обновления? Когда я использую boolVal, отображается второй снимок экрана. (Отображать только с Да) - person beasone; 14.05.2018
comment
(VARIANT_BOOL)1 неверно, используйте VARIANT_TRUE. В любом случае, я предполагаю, что он работает правильно, потому что Проводник в обычной папке также иногда отображает Да, Нет и ничего (imgur.com / a / dHK4TaL). - person Anders; 14.05.2018
comment
Если я использую VARIANT_TRUE, VARIANT_FALSE и pv- ›boolVal, он все равно будет отображать только Yes. - person beasone; 14.05.2018
comment
Вы возвращаете S_OK, даже если он не передается? - person Anders; 14.05.2018
comment
О, спасибо, вот в чем проблема. Когда я возвращаю S_OK для них обоих, работает! - person beasone; 14.05.2018