SHOpenFolderAndSelectItems()与数组

时间:2017-11-30 00:46:10

标签: windows c++11 visual-studio-2015

我可以在琐碎的案例中成功使用SHOpenFolderandSelectItems()。代码看起来类似于:

ITEMIDLIST *idl = ILCreateFromPath(L"C:\\testing\\example.txt");
SHOpenFolderAndSelectItems(idl, 0, 0, 0);
ILFree(idl);

现在我要做的是打开一个文件夹并选择其中的多个文件。但我对SHOpenFolderAndSelectItems()期待的内容感到困惑。简化,这就是我正在尝试的:

ITEMIDLIST *folder = ILCreateFromPath(L"C:\\testing\\");
std::vector<ITEMIDLIST*> v;
v.push_back( ILCreateFromPath(L"C:\\testing\\test1.txt");
v.push_back( ILCreateFromPath(L"C:\\testing\\test2.txt");
v.push_back( ILCreateFromPath(L"C:\\testing\\test3.txt");

SHOpenFolderAndSelectItems(folder, v.size(), v.data(), 0);

for (auto idl : v)
{
    ILFree(idl);
}
ILFree(folder);

这导致:

error C2664: 'HRESULT SHOpenFolderAndSelectItems(LPCITEMIDLIST,UINT,LPCITEMIDLIST *,DWORD)': cannot convert argument 3 from '_ITEMIDLIST **' to 'LPCITEMIDLIST *'

创建项目数组的好方法是什么?

2 个答案:

答案 0 :(得分:2)

这只是语法错误。你有两个选择:

1)

使用std::vector<LPCITEMIDLIST> v;

在这种情况下,您需要在致电ILFree(const_cast<LPITEMIDLIST>(idl));时使用 const_cast

2。)

使用std::vector<LPITEMIDLIST> v;

在这种情况下,您需要在电话

中使用 const_cast

SHOpenFolderAndSelectItems(folder, v.size(), const_cast<LPCITEMIDLIST*>(v.data()), 0);

然而二进制代码在两种情况下绝对相同

答案 1 :(得分:1)

尝试如下所示(工作):

HRESULT hr;
hr = CoInitializeEx(0, COINIT_MULTITHREADED);

ITEMIDLIST *folder = ILCreateFromPath("C:\\testing\\");
std::vector<LPITEMIDLIST> v;
v.push_back(ILCreateFromPath("C:\\testing\\test1.txt"));
v.push_back(ILCreateFromPath("C:\\testing\\test2.txt"));

SHOpenFolderAndSelectItems(folder, v.size(), (LPCITEMIDLIST*)v.data(), 0);

for (auto idl : v)
{
    ILFree(idl);
}
ILFree(folder);