![](/img/trans.png)
[英](Converting c# to Java JNA) - GetModuleFileName from hwnd
[英]Passing an HWND from a java program to a C library
我已獲得將C#Windows Form GUI轉換為Java Swing GUI的任務。 我必須使用用C編寫的相同庫。庫中的功能之一需要窗口的本機句柄才能將C程序鏈接到窗口。 在C#代碼中,本機句柄的使用非常簡單,並且將Intptr
傳遞給該函數。 在Java中是另外一個故事。 我找到了一種使用JNA(Java Native Access)和HWND
表示本機句柄的方法來獲取窗口的句柄的方法。 問題是,當我使用HWND
給句柄時,每次都會彈出無效的內存訪問異常。 這是我正在使用的代碼。
主類:
public class main {
public static void main(String[] args) {
JFrame jFrame = new JFrame();
jFrame.setSize(5000,5000);
jFrame.setVisible(true);
final HWND ptrRef = new HWND(Native.getComponentPointer(jFrame));
CLibrary cl = CLibrary.INSTANCE;
System.out.println("Handle: "+ptrRef);
String sPath = "C:\\Users\\markm\\IdeaProjects\\JFrameHandle\\Release";
cl.clStart(ptrRef, sPath, true);
}
}
CLibrary接口:
public interface CLibrary extends Library {
Clibrary INSTANCE = (CLibrary) Native.loadLibrary("C:\\Users\\markm\\IdeaProjects\\JFrameHandle\\Release\\clibrary",CLibrary.class);
void clStart(HWND parent, String libraryPath, boolean hidePanel);
}
不幸的是,由於我只有.dll文件,因此我無法訪問C代碼,但是在我可以訪問該代碼之前,我需要知道自己是否做錯了什么。 如果有人可以向我指出如何使用窗口句柄的正確方向,或者有另一種方法可以通過另一端的JNI傳遞句柄,請發表評論,我可以使用我所能獲得的所有幫助。
提前致謝。
無效的內存訪問錯誤表明您沒有為傳遞給該函數的任何指針分配本機端內存。 由於String和boolean都不是問題,因此您知道傳遞HWND
並不是正確的映射。
沒有看到C API,我只能猜測,但是根據您對它的描述采用IntPtr
它期望本機地址為整數( int
或long
取決於32位或64位)。
我懷疑您需要將接口映射更改為long
或int
並將Pointer.nativeValue(HWND.getPointer())
傳遞給它。 (或者簡化您的代碼以繞過HWND
存儲,而只是最初使用Pointer.nativeValue(Native.getComponentPointer(jFrame))
獲得整數。)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.