C#WindowsフォームGUIをJava Swing GUIに変換するタスクが与えられました。私はCで書かれた同じライブラリを使用する必要があります。ライブラリの関数の1つは、Cプログラムをウィンドウにリンクできるようにウィンドウのネイティブハンドルが必要です。 C#コードでは、ネイティブハンドルの使用はかなり簡単で、Intptr
が関数に渡されます。 Javaではそれは別の話です。私は、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を通してハンドルを渡す方法があれば、私が得ることのできるすべての助けを使うことができるコメントをお願いします。
ありがとうございます。
このCライブラリは、マネージドランタイムが所有するGUIウィンドウを直接操作することになっています。 – chrylis
dllを使用しているので、Windows OSに効果的にバインドされています。書き直しのポイントは何ですか? – Amit
@chrylis - Cライブラリはメインウィンドウに 'ウィンドウ'を入れています。それで、メインウィンドウのハンドルをライブラリに渡してポイント参照があるようにしようとしています。 –