Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/136.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ “的值;“共享”;在shell命名空间扩展中未正确显示列_C++_Windows_Shell Extensions_Shell Namespace Extension - Fatal编程技术网

C++ “的值;“共享”;在shell命名空间扩展中未正确显示列

C++ “的值;“共享”;在shell命名空间扩展中未正确显示列,c++,windows,shell-extensions,shell-namespace-extension,C++,Windows,Shell Extensions,Shell Namespace Extension,我使用shell名称空间扩展在Windows7上创建一个虚拟文件夹。 我想将列添加到此虚拟文件夹,以便它可以显示虚拟文件的详细信息。但是,“共享”的值无法正确显示。 以下是相关代码: else if (IsEqualPropertyKey(*pkey, PKEY_IsShared)) { if (cch) { hr = StringCchCopy(pszRet, cch, L""); } else

我使用shell名称空间扩展在Windows7上创建一个虚拟文件夹。 我想将列添加到此虚拟文件夹,以便它可以显示虚拟文件的详细信息。但是,“共享”的值无法正确显示。 以下是相关代码:

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\u true
。 但是,当我检查它在UI中显示的值时,它会为所有对象显示
no
: 如您所见,在“共享”列中,所有值都是“否”。 实际上,前3个文件是共享的,它们应该是“是”。 当调试器到达上述代码中的断点时,这三个文件的值为
VARIANT\u 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=共享,其工作原理如下:
仅显示前三个文件的“是”

如果我使用
VARIANT\u TRUE
VARIANT\u FALSE
pv->boolVal
,它仍然只显示“Yes”

-----工作更新-------------------

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\u TRUE/FALSE即可。

为什么要使用
pboolVal
?你必须使用
boolVal
@SimonMourier你能看到我的更新吗?当我使用布尔瓦尔时,它会显示第二个屏幕截图。(仅显示“是”)您能看到我的更新吗?当我使用布尔瓦尔时,它会显示第二个屏幕截图。(仅显示“是”)
(VARIANT\u BOOL)1
错误,请使用
VARIANT\u TRUE
。无论如何,我假设它工作正常,因为普通文件夹中的资源管理器有时也会显示Yes、No和nothing()。如果我使用VARIANT\u TRUE和VARIANT\u FALSE以及pv->boolVal,它仍然只显示“Yes”。即使没有共享,您是否返回S\u OK?哦,谢谢,这就是问题所在。当我为他们两人返回S_OK时,它起作用了!
if (isShared)
            {
                shared = VARIANT_TRUE;
                pv->boolVal = shared;
            }
            else
            {
                shared = VARIANT_FALSE;
                pv->boolVal = shared;
            }           

            hr = S_OK;