编程对象数组的参数

时间:2018-01-09 07:07:59

标签: c++ winapi visual-c++ explorer

我是一名Java程序员,需要一种在资源管理器中显示多个文件的方法,因此我找到了一个允许这样做的函数SHOpenFolderAndSelectItems(资源管理器CLI只允许选择一个文件)。

我已经从这里和那里编写了样本代码,并且它成功地用于硬编码路径,但是现在我希望程序接受包含文件夹的路径作为第一个参数和要选择的文件作为所有其余部分。

这是一个硬编码的。

#include "stdafx.h"
#include <Objbase.h>
#include <Shlobj.h>
#include "RevealMultiple.h"


int _tmain(int argc, _TCHAR* argv[])
{
        //Directory to open
    ITEMIDLIST *dir = ILCreateFromPath(_T("C:\\"));

    //Items in directory to select
    ITEMIDLIST *item1 = ILCreateFromPath(_T("C:\\Program Files\\"));
    ITEMIDLIST *item2 = ILCreateFromPath(_T("C:\\Windows\\"));
    const ITEMIDLIST* selection[] = { item1, item2 };

    UINT count = sizeof(selection) / sizeof(ITEMIDLIST);

    CoInitialize(NULL);

    //Perform selection
    HRESULT res = SHOpenFolderAndSelectItems(dir, count, selection, 0);

    //Free resources
    ILFree(dir);
    ILFree(item1);
    ILFree(item2);

    CoUninitialize();

    return res;
}

这里的代码可以让我了解我想要实现的目标。

 #include "stdafx.h"
#include <Objbase.h>
#include <Shlobj.h>
#include "RevealMultiple.h"
#include <list>


int _tmain(int argc, _TCHAR* argv[])
{
    //Directory to open
    ITEMIDLIST *dir = ILCreateFromPath(argv[0]);
    const ITEMIDLIST* files = new ITEMIDLIST[argc - 1];

    //Items in directory to select
    std::list<ITEMIDLIST*> filesList;

    for (int i = 1; i < argc; i++)
    {
        filesList.push_back(ILCreateFromPath(argv[i]));
    }

    CoInitialize(NULL);

    //Perform selection
    HRESULT res = SHOpenFolderAndSelectItems(dir, filesList.size, filesList._Get_data(), 0);

    //Free resources
    ILFree(dir);
    for (auto file : filesList)
    {
        ILFree(file);
    }

    CoUninitialize();

    return res;
}

但我明显错了:

revealmultiple.cpp(25): error C3867: 'std::list<ITEMIDLIST *,std::allocator<_Ty>>::size': non-standard syntax; use '&' to create a pointer to member
1>        with
1>        [
1>            _Ty=ITEMIDLIST *
1>        ]

如何将字符串参数数组正确转换为ITEMIDLIST*数组,以便将其传递给SHOpenFolderAndSelectItems?

感谢您的帮助。

2 个答案:

答案 0 :(得分:0)

首先请注意,argv [0]是用于调用程序的命令,常规参数从argv [1]开始。

话虽如此,以下内容应该是你所追求的:

ITEMIDLIST *dir = ILCreateFromPath(_T(argv[0]);
ITEMIDLIST ** ppItems = new ITEMIDLIST *[argc-2];
for(int ndx = 2; argc > ndx; ++ndx)
  ppItems[ndx] = ILCreateFromPath(_T(argv[ndx]);

答案 1 :(得分:0)

std::list这样的容器不保证数据存储为连续的内存块,不适合使用期望指向数组的指针的SHOpenFolderAndSelectItems等API

标准容器的唯一有效选择是std::vectorstd::array,普通旧数组或任何手动分配的连续内存块。

使用std::vector您的代码更改为:

std::vector<ITEMIDLIST*> filesList;

HRESULT res = SHOpenFolderAndSelectItems(dir, filesList.size(), filesList.data(), 0);

请注意,size()是一个函数,而不是您在原始代码中处理它的数据成员。这就是编译器出错的原因。使用std::vector时,无需使用专有成员函数来获取指向数据的指针,std::vector::data()已明确定义。