- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在调用此方法 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/
我在调用此方法 IShellFolder::GetUIObject 时遇到问题,我不知道如何创建指向指针数组的指针作为此函数的第三个参数。在文档中,该函数的标题是: HRESULT GetUIObje
我是一名优秀的程序员,十分优秀!