Значение для «Shared» столбец не отображается правильно в расширении пространства имен оболочки

Я использую расширение пространства имен оболочки для создания виртуальной папки в 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;

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

0

Решение

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

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

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]