gpt4 book ai didi

java - JNA 调用 Win32 API 方法 IShellFolder::GetUIObjectOf

转载 作者:行者123 更新时间:2023-12-02 01:16:26 30 4
gpt4 key购买 nike

我在调用此方法 IShellFolder::GetUIObject 时遇到问题,我不知道如何创建指向指针数组的指针作为此函数的第三个参数。在文档中,该函数的标题是:

HRESULT GetUIObjectOf(
HWND hwndOwner,
UINT cidl,
PCUITEMID_CHILD_ARRAY apidl,
REFIID riid,
UINT *rgfReserved,
void **ppv
);

这是我的代码:

String directory = "c:\\Users";
String file = "c:\\Users\\Duchon\\Downloads\\Baumüller Brno, s.r.o.PS43668.prpkg";
try {
PointerByReference psfDesktopPTR = new PointerByReference();
WinNT.HRESULT hResult = Shell32.INSTANCE.SHGetDesktopFolder(psfDesktopPTR);
if (COMUtils.SUCCEEDED(hResult)) {
IntByReference pcheaten = new IntByReference();
PointerByReference ppidl = new PointerByReference();
IntByReference pdwAttributes = new IntByReference();
MyIShellFolder psfDesktop = MyIShellFolder.Converter.PointerToIShellFolder(psfDesktopPTR);
hResult = psfDesktop.ParseDisplayName(null, null, new WString(file), pcheaten, ppidl, pdwAttributes);
PointerByReference iContextMenuPtr = new PointerByReference();
if (COMUtils.SUCCEEDED(hResult)) {
Pointer[] ppidls = new Pointer[1];
ppidls[0] = ppidl.getValue();
hResult = psfDesktop.GetUIObjectOf(null, 1, ppidl.getValue(), new Guid.REFIID(IContextMenu.IID_IContextMenu), new IntByReference(), iContextMenuPtr);
if (COMUtils.SUCCEEDED(hResult)) {
// QueryIContextMenu ...
}
}
}
}
catch (Exception e) {
e.printStackTrace(System.err);
}

但是我收到无效内存访问异常。我需要一种针对一组文件的解决方案,而不仅仅是一个文件。非常感谢。

最佳答案

当您收到无效内存访问错误时,这表明您需要正确分配 native 内存。上面的代码仅声明了一个 Java 端指针数组。

C 中的数组使用连续内存。这意味着您必须为数组分配足够大的单个 native 内存块;收集一堆单独的分配是不够的(这是在 Java 中声明单个 Pointer 变量所做的)。

您有两个主要选项来分配此 native 内存块:

选项 1. 使用 JNA 的 Memory类来显式分配您需要的内存大小。如果您分配一个指针数组,您将像这样分配:Memory m = new Memory(numberOfElements * Native.POINTER_SIZE);当您将返回值放入此内存时,您将使用偏移量从数组中提取适当的指针,例如,对于 0 索引的 i th 指针,执行 Pointer p = m.getPointer(i * Native.POINTER_SIZE);

选项 2. 创建 Structure适当大小(在本例中,包含一个指针元素)并使用 Structure.toArray()分配结构数组。所以你可以定义:

    @FieldOrder ({"childId"})
class PCUITEMID_CHILD extends Structure {
public Pointer childId;
}

然后分配数组

PCUITEM_CHILD[] pcuItemIdArray = new PCUITEMID_CHILD().toArray(numberOfElements);

然后您可以传递此数组变量,并使用传统数组语法访问其结果。

Pointer p = pcuItemIdArray[0].childId;

关于java - JNA 调用 Win32 API 方法 IShellFolder::GetUIObjectOf,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57657869/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com