Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JNA调用Win32 API方法IShellFolder::GetUIObjectOf_Java_Jna - Fatal编程技术网

Java JNA调用Win32 API方法IShellFolder::GetUIObjectOf

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

调用此方法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);
}

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

当您遇到无效内存访问错误时,提示您需要正确分配本机内存。上面的代码只声明了一个Java端指针数组

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

分配这一块本机内存有两个主要选项:

备选案文1。使用JNA的
Memory
类来显式分配所需的内存大小。如果您分配一个指针数组,您将这样分配:
Memory m=new Memory(numberOfElements*Native.POINTER\u SIZE)
当您将返回的值放入该内存时,您将使用偏移量从数组中提取适当的指针,例如,对于0索引的
i
th指针,do
pointer 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指针,do
pointer 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;