"Shared" 列的值在 shell 命名空间扩展中未正确显示
The value for "Shared" column is not displayed correctly in shell namespace extension
我使用 shell 命名空间扩展在 windows 7 上创建了一个虚拟文件夹。
我想向这个虚拟文件夹添加列,以便它可以显示虚拟文件的详细信息。但是,"Shared" 的值无法正确显示。
相关代码如下:
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
。
但是,当我检查它在 UI 中显示的值时,它会为所有对象显示 no
:
可以看到,在"Shared"这一列,所有的值都是"no"。
实际上,前 3 个文件是共享的,它们应该是 "yes"。
当调试器到达上述代码中的断点时,这三个文件的值为 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;
,它将像这样工作:
只显示前三个文件"Yes"。
如果我使用VARIANT_TRUE
和VARIANT_FALSE
和pv->boolVal
,它仍然只显示"Yes"。
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。
我使用 shell 命名空间扩展在 windows 7 上创建了一个虚拟文件夹。 我想向这个虚拟文件夹添加列,以便它可以显示虚拟文件的详细信息。但是,"Shared" 的值无法正确显示。 相关代码如下:
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
。
但是,当我检查它在 UI 中显示的值时,它会为所有对象显示 no
:
VARIANT_TRUE
。
这是 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
,它仍然只显示"Yes"。
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。