我可以在琐碎的案例中成功使用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 *'
创建项目数组的好方法是什么?
答案 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);