2011-05-05 45 views
0

我試圖在JNA中映射Win32函數EnumJobs。該方法具有以下特徵:如何將指針映射到JNA中的結構陣列

BOOL EnumJobs(
    __in HANDLE hPrinter, 
    __in DWORD FirstJob, 
    __in DWORD NoJobs, 
    __in DWORD Level, 
    __out LPBYTE pJob, 
    __in DWORD cbBuf, 
    __out LPDWORD pcbNeeded, 
    __out LPDWORD pcReturned 
); 

我想出大部分除了LPBYTE pJob根據文檔這是一個指向接收JOB_INFO結構的陣列的緩衝器。我似乎無法弄清楚如何正確執行此映射。到目前爲止,我有:

boolean EnumJobs(HANDLE hPrinter, DWORD FirstJob, DWORD NoJobs, DWORD Level, JOB_INFO_2[] pJob, DWORD cbBuf, IntByReference pcbNeeded, IntByReference pcReturned); 

但我發現了一個IllegalArgumentException:無法確定嵌套結構的大小:不能實例類com.sun.jna.structure(java.lang.InstantiationException)任何見解進入如何映射和處理將不勝感激。

回答

2

1)找出有多少JOB_INFO結構需要(或希望)

2)使用Structure.toArray()上JOB_INFO的單個實例,讓他們的連續(存儲器)陣列

3)根據您的方法簽名傳遞第一個JOB_INFO結構或其內存(Structure.getPointer)。

請注意,方法簽名中的Structure參數將向JNA表明它需要自動將Java結構內存與本機內存(包括整個數組)進行同步;使用指針會將同步交給您。

另外,結構作爲方法參數意味着「struct *」,而不是「struct」作爲參數類型。

+0

我得到了傳遞指針的函數調用。我不太清楚您的Java結構內存與本機內存的同步是什麼意思。有沒有這樣做的例子? – 2011-05-06 14:42:20

+0

沒關係想通了。在添加EnumJobs調用之前,需要調用JOB_INFO_2結構的寫入方法,然後我需要調用JOB_INFO_2結構的read方法。謝謝你的幫助! – 2011-05-06 14:56:23