c ++ - Værdien for 'Shared' kolonnen vises ikke korrekt i shell navneområdeudvidelse

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg bruger shell namespace extension til at oprette en virtuel mappe på Windows 7.
Jeg vil gerne tilføje kolonner til denne virtuelle mappe, så den kan vise de virtuelle filmers detaljer. Men værdien for 'Shared' kan ikke vises korrekt.
Her er den relaterede kode:


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;
        }
    }


Ovenstående kode er placeret i funktionen IFACEMETHODIMP GetDetailsEx(PCUITEMID\_CHILD pidl, const PROPERTYKEY *pkey, VARIANT *pv);, som er en Windows-grænseflade.
Indtast billedbeskrivelse her
Jeg tilføjer breakpoints til ovenstående kode, det viser sig, når variablen isShared er true, bliver variablen shared VARIANT\_TRUE.
Når jeg kontrollerer den værdi, den viser i brugergrænsefladen, vises den no for alle objekter:
Indtast billedbeskrivelse her
Som du kan se, i kolonnen 'Delt' er værdien 'nej'.
Faktisk deles de 3 øverste filer, og de skal være 'ja'.
når debuggeren når breakpointet i ovenstående kode, er værdien VARIANT\_TRUE for disse tre filer.
Her er WINDOWS-definitionen for PKEY\_IsSahred [23] [24]


//  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);


Jeg har også forsøgt at redigere ovenstående kode som:


if (isShared) shared = (VARIANT\_BOOL)1;
else shared = (VARIANT\_BOOL)0;


Det gør ikke ork.
Hvis jeg erstatter pv->pboolVal = &shared; med pv->boolVal= shared;, vil det fungere som:
Indtast billedbeskrivelse her
Vis kun 'Ja' for de tre bedste filer. [25]


Hvis jeg bruger VARIANT\_TRUE og VARIANT\_FALSE og pv->boolVal, vises det stadig kun 'Ja'.


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;


----- Arbejdsopdatering -------------------


if (isShared)
            {
                shared = VARIANT\_TRUE;
                pv->boolVal = shared;
            }
            else
            {
                shared = VARIANT\_FALSE;
                pv->boolVal = shared;
            }           

            hr = S\_OK;


Denne ene virker for mig!

Bedste reference


Du bør ikke bruge pboolVal medlemmet her og tildele en peger til noget på stakken er bestemt ikke den rigtige ting at gøre. Typen skal være VT\_BYREF|VT\_BOOL for at bruge pboolVal, men i dette tilfælde er der intet punkt at gøre det, og du har ingen hukommelse, du kan påpege.


Brug blot boolVal og VARIANT\_TRUE/FALSE.