【问题标题】:The value for "Shared" column is not displayed correctly in shell namespace extension“Shared”列的值未在 shell 命名空间扩展中正确显示
【发布时间】:2018-10-22 10:19:33
【问题描述】:

我使用 shell 命名空间扩展在 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 提供的界面。 我在上面的代码中添加了断点,原​​来当变量isSharedtrue时,变量shared确实变成了VARIANT_TRUE。 但是,当我检查它在 UI 中显示的值时,它会为所有对象显示 no 如您所见,在“共享”列中,所有值都是“否”。 实际上,前 3 个文件是共享的,它们应该是“是”。 当调试器到达上述代码中的断点时,这三个文件的值为VARIANT_TRUE。 这是PKEY_IsSahred的WINDOWS定义

//  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_TRUEVARIANT_FALSEpv->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?你必须使用boolVal
  • @SimonMourier 你能看到我的更新吗?当我使用 boolVal 时,它会显示第二个屏幕截图。 (仅显示“是”)

标签: c++ windows shell-extensions shell-namespace-extension


【解决方案1】:

您不应该在此处使用pboolVal 成员,并且将指针分配给堆栈上的某些内容肯定不是正确的做法。类型必须是 VT_BYREF|VT_BOOL 才能使用 pboolVal 但在这种情况下没有必要这样做,而且您没有可以指向的内存。

只需使用 boolVal 和 VARIANT_TRUE/FALSE。

【讨论】:

  • 你能看到我的更新吗?当我使用 boolVal 时,它会显示第二个屏幕截图。 (仅显示“是”)
  • (VARIANT_BOOL)1 错误,使用VARIANT_TRUE。无论如何,我认为它可以正常工作,因为普通文件夹中的资源管理器有时也会显示是、否和什么都没有(imgur.com/a/dHK4TaL)。
  • 如果我使用 VARIANT_TRUE 和 VARIANT_FALSE 和 pv->boolVal,它仍然只显示“是”。
  • 即使未共享,您是否返回 S_OK?
  • 哦,谢谢,这就是问题所在。当我为他们两个都返回 S_OK 时,它起作用了!
猜你喜欢
  • 1970-01-01
  • 2012-08-28
  • 2012-09-02
  • 2013-02-14
  • 1970-01-01
  • 1970-01-01
  • 2011-06-28
  • 1970-01-01
  • 2011-12-05
相关资源
最近更新 更多