Windows 7 Shell命名空间扩展中Shared列显示异常问题求助
我最近在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
相关产品推荐
相关产品推荐

