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

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

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" все значение равно "no". На самом деле, верхние 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;

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

1 ответ

Решение

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

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

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