如何在jna中获取指向结构数组的指针

时间:2016-07-18 15:56:05

标签: java c jna

我真的希望得到一个指向结构数组的指针,就像在C中一样,使用Java jna。我想访问EnumPrinters()函数,以下是它的参数:

BOOL EnumPrinters(
_In_ DWORD Flags,
_In_ LPTSTR Name,
_In_ DWORD Level,
_Out_ LPBYTE pPrinterEnum,
_In_ DWORD cbBuf,
_Out_ LPDWORD pcbNeeded,
_Out_ LPDWORD pcReturned
);

在Java中它

public boolean EnumPrinters(int i, String string, int i1, com.sun.jna.Pointer pntr, int i2,
        com.sun.jna.ptr.IntByReference ibr, com.sun.jna.ptr.IntByReference ibr1);

我遇到的问题是我继续收到错误122,这意味着调用系统调用失败。这是我的代码:

IntByReference  pcbNeeded= new  IntByReference();
int pcb=0;
pcbNeeded.setValue(pcb);
IntByReference  pcReturned= new  IntByReference();
int pcR=0;
pcReturned.setValue(pcR);
PRINTER_INFO_4 printer = new PRINTER_INFO_4();  
PRINTER_INFO_4 PRINT[] = (PRINTER_INFO_4[])printer.toArray(20);
Pointer point = PRINT[0].getPointer();
int size = PRINT[0].size();
Winspool.INSTANCE.EnumPrinters(Winspool.PRINTER_ENUM_LOCAL,null, 4, point, size,pcbNeeded ,pcReturned);
System.out.println("Operation started!");
System.out.println(printer.pPrinterName);
int rc =  Kernel32.INSTANCE.GetLastError();
System.out.println("error " + rc);

我只想用我的代码在计算机上安装所有已安装的打印机。

1 个答案:

答案 0 :(得分:0)

您需要传递第一个结构而不是其地址的指针副本,否则JNA不知道自动将Java结构与本机内存同步。

public boolean EnumPrinters(int i, String string, 
                            int i1, PRINTER_INFO_4 pntr, 
                            int i2, com.sun.jna.ptr.IntByReference ibr,
                            com.sun.jna.ptr.IntByReference ibr1);

您还应该保留原始参数名称,这样可以使映射更具可读性。

您还可以在本机调用之前在每个分配的Structure.write()上显式调用Structure,在调用之后显式调用Structure.read(),但JNA在识别{{1}时自动执行此操作在函数签名中(包括所有数组元素,如果有的话)。