我正在尝试构建一个使用默认 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.h
或 pch .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/