JNAを使用してdelphidllの関数を呼び出そうとしています。関数の定義は次のとおりです。
function myFuncGetName (aHandle : THandle; var aBuf : pwideChar ): integer; export;
私のjnaマッピングは次のようになります。
int myFuncGetName(PointerByReference aHandle, WString aBuf);
戻り値は、成功の場合は0、失敗の場合は-1である必要があり、常に-1を取得しています。
WinDbgを起動してプロセスに接続しましたが、myFuncGetNameで壊れます。
057cb384 eb11 jmp myDLL!myFuncGetName+0x87 (057cb397)
057cb386 b8dcb37c05 mov eax,offset myDLL!myFuncGetName+0xcc (057cb3dc)
057cb38b 8b55f8 mov edx,dword ptr [ebp-8]
057cb38e 8902 mov dword ptr [edx],eax ds:002b:00000000=???????? <-- ### breaks here ###
057cb390 c745f4ffffffff mov dword ptr [ebp-0Ch],0FFFFFFFFh
私はアセンブリの専門家ではないので、間違っているところを訂正してください。アドレス(関数の引数)を場所ebp-8からedxレジスタに移動すると思います。ebp-8は値0を指しているため、edxは0です。eaxをedxが指すアドレスに移動します。何も0に移動することは想定されていないので、すべてが壊れますか?
引数が関数に正しく渡されないのはなぜですか?以前の呼び出しと同じDLLからaHandleを取得し、aBufをWStringとして設定しました。aBuf= new WString( "placeholderstring"); 関数が戻った後、aBufが実際のテキストで埋められることを期待しています。
これはすべて、Java764ビットを搭載したWindows7で実行されています。DLLは32ビットDLLです。
更新と解決策:
コメントをありがとうDavidとRob。stdcall宣言を使用するようにdelphi定義を変更しました。関数を呼び出すと、0が返されます。pwideCharの値を取得するために、次のことを行いました。
int charcount= "placeholder".length();
PointerByReference aBuf = new PointerByReference(new Memory(charcount*4));
int returnvalue = myFuncGetName(aHandle, aBuf);
if(returnvalue == 0) {
System.out.println(aBuf.getValue().getString(0, true));
}