c++ - 为 IShellItemArray 创建 PCIDLIST_ABSOLUTE_ARRAY

标签 c++ winapi com windows-8

我必须调用 IApplicationActivationManager::ActivateForProtocol用于打开 Windows 8 应用程序,因此我必须提供 IShellItemArray* 数据。

基本上,我只想创建一个新的 IShellItemArray,所以我尝试调用 SHCreateShellItemArrayFromIDLists .

但我真的不知道第二个参数的类型。 MSDN 说:

rgpidl [in]
  Type: PCIDLIST_ABSOLUTE_ARRAY
    A list of cidl constant pointers to ITEMIDLIST structures.

我找不到任何关于这种类型的信息。不在 MSDN 中,不在我最喜欢的搜索引擎中。

如果有人可以阐明此类型及其创建/初始化或可以提供一些示例代码,我将很高兴。

最佳答案

PCIDLIST_ABSOLUTE_ARRAY 类型等同于 LPCITEMIDLIST *,即指向 ITEMIDLIST(也称为 PIDL)的常量指针数组。 typedef 的“ABSOLUTE”部分表示 PIDL 必须是绝对的(即从桌面开始的完全合格的 PIDL)而不是子 PIDL(相对于某个文件夹)。

您可以像创建任何数组一样创建一个,例如

PCIDLIST_ABSOLUTE pIdlArray[10];
pIdlArray[0] = myFirstPidl;
pIdlArray[1] = mySecondPidl;
...

不同 typedef 的原因是 STRICT_TYPED_ITEMIDS 定义。如果定义了此符号,则 shell API header 将切换为使用“类型化”PIDL 指针,这在您打算使用绝对 PIDL、子 PIDL、常量 PIDL 等时会更加明显。如果 STRICT_TYPED_ITEMIDS 未定义,您可以在任何地方使用 LPITEMIDLIST 及其变体。

关于c++ - 为 IShellItemArray 创建 PCIDLIST_ABSOLUTE_ARRAY,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15009458/

相关文章:

c++ - 从这往哪儿走

c++ - 是否从函数未定义的行为返回取消引用的指针作为引用?

c++ - 在窗口中绘制位数组(rgb)

c# - 是否可以通过 COM 公开 DateTime 字段?

c# - 如何在 C# 上声明和实现一个继承自另一个 COM 接口(interface)的 COM 接口(interface)?

c++ - MOD 运算是否比乘法更占用 CPU?

c++ - FreeType2 - 字体较小

winapi - 绕过 ITEMIDLIST 的 MAX_PATH 限制?

c# - 自动滚动控件(WinAPI)?

COM Interop 中的 .NET 属性?