0

シェル名前空間拡張機能を使用して、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なります。ただし、UI に表示される値を確認すると、すべてのオブジェクトに対して 表示され ます。実際には、上位 3 つのファイルが共有されており、「はい」のはずです。デバッガーが上記のコードのブレークポイントに到達すると、これら 3 つのファイルの値になります。これはWINDOWSの定義ですtruesharedVARIANT_TRUEnoここに画像の説明を入力VARIANT_TRUEPKEY_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;、次のように動作します: ここに画像の説明を入力 上位 3 つのファイルに対してのみ「はい」を表示します。

VARIANT_TRUEand VARIANT_FALSEandを使用し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;

これは私のために働く!

4

1 に答える 1