c++ - 无法将参数从 'LPITEMIDLIST *' 转换为 'LPCITEMIDLIST *'

标签 c++ winapi shell-extensions

我正在尝试构建一个使用默认 Windows 对话框复制多个文件的功能。

我从微软找到了这个例子:FileOperationSample.cpp

但是我在这一行收到错误:

IShellItemArray *psia; hr = SHCreateShellItemArray(NULL, psfSampleSrc, c_cMaxFilesToCreate, &rgpidlChildren[0], &psia);

        PITEMID_CHILD rgpidlChildren[c_cMaxFilesToCreate] = { 0 };

        for (UINT i = 0; SUCCEEDED(hr) && i < ARRAYSIZE(rgpidlChildren); i++)
        {
            WCHAR szSampleFileName[MAX_PATH];
            hr = StringCchPrintfW(szSampleFileName, ARRAYSIZE(szSampleFileName), L"%s%u.%s", c_szSampleFileName, i, c_szSampleFileExt);
            if (SUCCEEDED(hr))
            {
                hr = psfSampleSrc->ParseDisplayName(NULL, NULL, szSampleFileName, NULL, (PIDLIST_RELATIVE *)&rgpidlChildren[i], NULL);
            }
        }
        if (SUCCEEDED(hr))
        {
            IShellItemArray *psia;
            hr = SHCreateShellItemArray(NULL, psfSampleSrc, c_cMaxFilesToCreate, &rgpidlChildren[0], &psia);

最佳答案

使用 VS2017 编译示例代码时没有任何错误或警告。但是,如果我删除 #define STRICT_TYPED_ITEMIDS,我会得到完全相同的错误。

解决方案:

确保您的源代码在包含任何 Windows header 之前具有#define STRICT_TYPED_ITEMIDS,最好是在预编译 header 的开头(stdafx.hpch .h,取决于 VS 版本)。

背景:

如果未定义 STRICT_TYPED_ITEMIDS,则启用 shtypes.h 中的以下定义:

#define PITEMID_CHILD LPITEMIDLIST              
#define PCUITEMID_CHILD_ARRAY LPCITEMIDLIST *

所以在这种情况下,SHCreateShellItemArray 需要一个指向 LPCITEMIDLIST 的指针作为第 4 个参数,但是您却传递给它一个指向 LPITEMIDLIST 的指针,这与预期的类型不兼容。

额外的 OldNewThing 链接:

STRICT_TYPED_ITEMIDS is the shell namespace version of the STRICT macro used by USER and GDI

关于c++ - 无法将参数从 'LPITEMIDLIST *' 转换为 'LPCITEMIDLIST *',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53569725/

相关文章:

c++ - 从 C++ 加载 http 页面以触发事件

c++ - winapi - 如何正确使用 LayeredWindows

c# - 在 Windows 资源管理器中打开 Windows 7 库

windows - 与 Windows 外壳集成

c++ - 为虚拟文件添加属性

c++ - C DLL 和 Python CTypes - 发布/调试中的不同返回

c++ - 重用 opengl 纹理

c++ - 关于我的第一个使用 Boost 库的程序的问题(异常(exception),长路径)

c++ - 如何循环加载所有用户的注册表配置单元

windows - 如何在不重新启动的情况下更新 Windows 资源管理器的 shell 扩展