c++ - “Shared”列的值未在 shell 命名空间扩展中正确显示
问题描述
我使用 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提供的界面函数中。
我在上面的代码中添加了断点,结果当变量isShared
为时true
,变量shared
确实变为VARIANT_TRUE
。但是,当我检查它在 UI 中显示的值时,它会显示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
and 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。
推荐阅读
- angular - 猫头鹰旋转木马的网格布局
- java - 如何减少 Memcached 值的长度
- ios - 如何在ios swift中重新加载TableView的可见单元格
- php - Mac 上的 Devlibox (Docker) 速度极慢
- kubernetes - “oc进程”将特殊字符“&”和“>”转换为unicode
- python - 无法从数据框中创建简单的 dict
- installation - 对使用 Homebrew 安装的脚本设置可执行权限
- java - 如何修复 Google 移动广告集成错误
- excel - 循环搜索同一行特定范围列的文本,一旦找到,在不同行但同一列中返回值
- php - 首次安装 Grav 时如何解决 PHPModules 错误?