Java JNA调用Win32 API方法IShellFolder::GetUIObjectOf
调用此方法IShellFolder::GetUIObject时遇到问题,我不知道如何创建指向指针数组的指针作为此函数的第三个参数。在文档中,此函数的标题为:Java JNA调用Win32 API方法IShellFolder::GetUIObjectOf,java,jna,Java,Jna,调用此方法IShellFolder::GetUIObject时遇到问题,我不知道如何创建指向指针数组的指针作为此函数的第三个参数。在文档中,此函数的标题为: HRESULT GetUIObjectOf( HWND hwndOwner, UINT cidl, PCUITEMID_CHILD_ARRAY apidl, REFIID riid, UINT
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);
}
但我得到无效的内存访问异常。我需要一个文件数组的解决方案,而不仅仅是一个。非常感谢。当您遇到无效内存访问错误时,提示您需要正确分配本机内存。上面的代码只声明了一个Java端指针数组 C中的数组使用连续内存。这意味着您必须为阵列分配一个足够大的本机内存块;仅收集一组单独的分配是不够的(这是Java中声明单个
指针变量所做的)
分配这一块本机内存有两个主要选项:
备选案文1。使用JNA的Memory
类来显式分配所需的内存大小。如果您分配一个指针数组,您将这样分配:Memory m=new Memory(numberOfElements*Native.POINTER\u SIZE)
当您将返回的值放入该内存时,您将使用偏移量从数组中提取适当的指针,例如,对于0索引的i
th指针,dopointer p=m.getPointer(i*Native.pointer\u SIZE)代码>
备选案文2。创建一个大小合适的结构
(在本例中,包含一个作为指针的元素),并使用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端指针数组
C中的数组使用连续内存。这意味着您必须为阵列分配一个足够大的本机内存块;仅收集一组单独的分配是不够的(这是Java中声明单个指针变量所做的)
分配这一块本机内存有两个主要选项:
备选案文1。使用JNA的Memory
类来显式分配所需的内存大小。如果您分配一个指针数组,您将这样分配:Memory m=new Memory(numberOfElements*Native.POINTER\u SIZE)
当您将返回的值放入该内存时,您将使用偏移量从数组中提取适当的指针,例如,对于0索引的i
th指针,dopointer p=m.getPointer(i*Native.pointer\u SIZE)代码>
备选案文2。创建一个大小合适的结构
(在本例中,包含一个作为指针的元素),并使用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;