2016-07-18 2 views
0

Java Jna를 사용하여 C와 같이 구조체 배열에 대한 포인터를 얻고 싶습니다. 매개 변수는에 내가 여기 EnumPrinters() 기능에 액세스하려면,하고 있습니다 : 자바에서jna에서 구조 배열에 대한 포인터를 얻는 방법

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

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

코드를 올바르게 포맷하십시오. 읽을 수 없습니다. – user3078414

+0

자바의 규칙 # 1에 포인터가 없다고하지 않습니까? – KevinDTimm

+1

[PrintServiceLookup] (http://docs.oracle.com/javase/8/docs/api/javax/print/PrintServiceLookup.html)이 필요에 맞지 않습니까? 일이 훨씬 쉬워 질 것입니다. – VGR

답변

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 이전에 기본 통화 Structure.write()Structure.read()를 호출 할 수 있지만이 함수 서명에 Structure 인식하면 JNA는 (모든 배열 요소를 포함하여있는 경우) 자동으로이 작업을 수행합니다.

관련 문제