gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 16:59:01 24 4
gpt4 key购买 nike

我真的想获得一个指向结构数组的指针,就像在 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);

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

最佳答案

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

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);

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

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

关于java - 如何在jna中获取指向结构体数组的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38441180/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com