You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Windows 7 Shell命名空间扩展中Shared列显示异常问题求助

解决Shell命名空间扩展中PKEY_IsShared列显示异常的问题

我最近在Windows 7系统里开发Shell命名空间扩展,创建虚拟文件夹后想给它添加列来展示虚拟文件的共享状态,结果遇到了个头疼的问题:Shared列里所有对象都显示"no",但实际上顶部3个文件应该是"yes"。

最开始我在GetDetailsEx接口里写的代码是这样的:

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;// 这里断点调试是正常的,isShared为true时shared确实是VARIANT_TRUE
        else 
            shared = VARIANT_FALSE; 
        pv->pboolVal = &shared; 
        hr = pv->pboolVal ? S_OK : E_OUTOFMEMORY; 
    } 
}

调试的时候明明看到isShared为true时shared被正确设为VARIANT_TRUE,但UI就是不买账。

先贴一下Windows定义的PKEY_IsShared,方便大家对照:

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

我一开始以为是VARIANT_TRUE的问题,改成直接赋值(VARIANT_BOOL)1或者0,结果还是没用。后来试着把pv->pboolVal = &shared;换成pv->boolVal= shared;,神奇的是顶部3个文件立刻正确显示"Yes"了!用VARIANT_TRUE/VARIANT_FALSE配合pv->boolVal也能正常工作。

最终能正常运行的代码是这样的:

if (isShared) { 
    shared = VARIANT_TRUE; 
    pv->boolVal = shared; 
} else { 
    shared = VARIANT_FALSE; 
    pv->boolVal = shared; 
} 
hr = S_OK;

问题原因分析

原来问题出在pboolVal和boolVal的区别上:

  • pboolVal是指向VARIANT_BOOL的指针,而我之前用的shared是函数内的局部变量,当GetDetailsEx执行完毕返回后,这个局部变量的内存会被释放,Shell后续读取的时候拿到的是无效内存地址,自然显示错误。
  • boolVal是VARIANT结构体本身自带的VARIANT_BOOL成员,直接赋值的话,值会被存在结构体里,函数返回后依然有效,Shell能正确读取到状态值。

内容的提问来源于stack exchange,提问作者beasone

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 07:30:16