我真的希望得到一个指向结构数组的指针,就像在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);
我只想用我的代码在计算机上安装所有已安装的打印机。
答案 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}时自动执行此操作在函数签名中(包括所有数组元素,如果有的话)。