2017-04-15 3 views
0

C# Windows Form GUI를 Java Swing GUI로 변환하는 작업이 제공되었습니다. C로 작성된 동일한 라이브러리를 사용해야합니다. 라이브러리의 함수 중 하나는 C 프로그램을 창에 연결할 수 있도록 창의 기본 핸들을 필요로합니다. C# 코드에서 네이티브 핸들의 사용은 상당히 간단하며 Intptr이 함수에 전달됩니다. 자바에서는 다른 이야기입니다. JNA (Java Native Access) 및 HWND 네이티브 핸들 표현을 사용하여 창 핸들을 얻는 방법을 찾았습니다. 문제는 내가 HWND을 사용하여 핸들에 잘못된 메모리 액세스 예외가 발생할 때마다 나타납니다. 여기에 제가 사용하고있는 코드가 있습니다.Java 프로그램에서 HWND를 C 라이브러리로 전달

메인 클래스 :

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를 통해 핸들을 전달할 수있는 방법이 있다면 내가 얻을 수있는 모든 도움을 사용할 수 있다는 의견을 말하십시오.

미리 감사드립니다.

+1

이 C 라이브러리는 관리되는 런타임에서 소유 한 GUI 창을 직접 조작해야한다고 생각합니까? – chrylis

+0

dll을 사용하고 있으므로 Windows OS에 효과적으로 묶여 있습니다. 재 작성의 요점은 무엇입니까? – Amit

+0

@chrylis - C 라이브러리가 기본 창에 '창'을 넣고 있습니다. 그게 내가 포인트 레퍼런스를 가지고 있도록 라이브러리에 메인 윈도우의 핸들을 전달하려고하는 이유입니다. –

답변

2

잘못된 메모리 액세스 오류는 사용자가 함수에 전달하는 모든 포인터에 대해 기본 메모리를 할당하지 않았 음을 나타냅니다. String과 boolean이 문제가 아니기 때문에 HWND을 전달하는 것이 올바른 매핑이 아니라는 것을 알고 있습니다. 이 정수로 기본 주소를 기대하고 있어요 IntPtr을 복용 난 단지 추측하지만 당신의 설명에 따라 할 수있는 C API를 보지 않고

은 (중 int 또는 long 32 비트 또는 64 비트에 따라).

인터페이스 매핑을 long 또는 int으로 변경하고 Pointer.nativeValue(HWND.getPointer())을 전달해야 할 것으로 판단됩니다. (또는 HWND 저장소를 우회하여 코드를 단순화하고 처음에는 Pointer.nativeValue(Native.getComponentPointer(jFrame))을 사용하여 정수를 가져옵니다.)

+0

입력 해 주셔서 감사합니다. 나는 C# 코드가 여전히 동일한 예외를 제공하고있는 유사한 값을 제공하고 있기 때문에 나에게 많은 의미를 부여하는 솔루션을 시도해 보았습니다. 나는 또한 IntByReference를 제공하려고 노력했다. 이것은 내가 자바에서 IntPtr에 상응하는 것이고 여전히 같은 결과라는 것을 발견했다. 나는 String 인자가 문제라고 의심하기 시작했다.나는 인코딩 (UTF-8 대 UTF-16)에 관한 차이가있을 수 있다고 들었지만 무엇을해야할지 모르겠습니다. –

+0

dll 문서에 연결할 수 있습니까? –

+0

불행히도 나는 어떤 문서도 가지고 있지 않다. 나는 곧 dll에 대한 더 많은 정보를 얻을 것이다. 나는 또한 문서를 요청할 것이다. 나는 설명서가 없어도 이상하지 않다는 것을 알고 있지만, 과제는 코드를 분석하고 다른 언어로 코드의 다른 버전을 생성하고 생성 할 수 있다는 것입니다. 또한 dll은 지금은 사유지입니다. 그래서 무엇을 보여야하는지 매우 신중해야합니다. 그래서 CLibrary라는 라이브러리가 매우 일반적인 것입니다. 미안하다면 도움이 매우 어렵습니다. –

관련 문제