Значение для столбца «Общий» не отображается правильно в расширении пространства имен оболочки - PullRequest
0 голосов
/ 12 мая 2018

Я использую расширение пространства имен оболочки для создания виртуальной папки в 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.enter image description here Я добавляю точки останова к приведенному выше коду, получается, когда переменная isShared равна true, переменная shared становится VARIANT_TRUE.Однако, когда я проверяю значение, отображаемое в пользовательском интерфейсе, для всех объектов отображается no: enter image description here Как видно, в столбце «Общий доступ» все значение равно «нет».».На самом деле, верхние 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;

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

Если я использую 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 Ответ

0 голосов
/ 12 мая 2018

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

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

...