Я использую расширение пространства имен оболочки для создания виртуальной папки в 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;
Этот работает для меня!
Вы не должны использовать pboolVal
член здесь и присвоение указателя на что-то в стеке, безусловно, не правильная вещь. Тип должен быть VT_BYREF|VT_BOOL
использовать pboolVal
но в этом случае нет смысла делать это, и у вас нет памяти, на которую вы можете указать.
Просто используйте boolVal
и VARIANT_TRUE / FALSE.
Других решений пока нет …