2017-04-15 9 views
0

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を通してハンドルを渡す方法があれば、私が得ることのできるすべての助けを使うことができるコメントをお願いします。

ありがとうございます。

+1

このCライブラリは、マネージドランタイムが所有するGUIウィンドウを直接操作することになっています。 – chrylis

+0

dllを使用しているので、Windows OSに効果的にバインドされています。書き直しのポイントは何ですか? – Amit

+0

@chrylis - Cライブラリはメインウィンドウに 'ウィンドウ'を入れています。それで、メインウィンドウのハンドルをライブラリに渡してポイント参照があるようにしようとしています。 –

答えて

2

無効なメモリアクセスエラーは、関数に渡すポインタにネイティブサイドメモリを割り当てていないことを示します。 Stringとbooleanは問題ではないので、HWNDを渡すことは正しいマッピングではありません。

CのAPIを見なければ、私はそれが(intまたはlongのいずれかの32ビットまたは64ビットに応じて)整数としてネイティブアドレスを期待していますだけで推測するが、IntPtrを取ることのあなたの説明に基づいてすることができます。

longまたはintに変更し、Pointer.nativeValue(HWND.getPointer())を渡す必要があると思われます。 (HWNDストレージをバイパスしてコードを単純化し、最初にPointer.nativeValue(Native.getComponentPointer(jFrame))を使用して整数を取得してください)

+0

入力いただきありがとうございます。私はあなたのソリューションを試してみましたが、それはC#コードが同じ例外を与えているのと同じような価値を与えて以来、私にとってはかなり意味があります。私はまた、IntByReferenceを与えようとしました。これは、JavaのIntPtrに相当するものであり、それと同じ結果です。 String引数が問題であると思われ始めています。私は、エンコーディング(UTF-8とUTF-16)の違いがあるかもしれないと言われましたが、何をすべきかはわかりません。 –

+0

dllのドキュメントにリンクできますか? –

+0

残念ながら私はドキュメントを持っていません。私はすぐにdllについてのより多くの情報を得るでしょう。私は文書も求めます。私はそれがドキュメントを持っていないことは奇妙なことを知っているが、割り当ては、コードを分析し、別の言語でコードの別のバージョンを抽出して作成することができます。また、dllは今の私有財産ですので、何を表示するかについては非常に注意する必要があります(そのため、ライブラリはCLibraryと呼ばれ、非常に汎用的です)。申し訳ありませんが、それは非常に困難です。 –

関連する問題