我想要調用一個函數在德爾福DLL使用JNA。函數的定義是:功能映射德爾福/帕斯卡DLL在JNA句柄和字符串
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
我不是一個組裝wiz所以我錯了。 我認爲它將地址(函數參數)從位置ebp-8移動到edx寄存器。 ebp-8指向值0,因此edx爲0. 它將eax移至edx指向的地址。 它不應該將任何東西移動到0,所以它都打破了?
爲什麼我的參數不能正確傳遞給函數? 我從以前的調用中得到一個來自同一個DLL的句柄,並且我設置了一個aBuf作爲 WString aBuf = new WString(「placeholderstring」); 我希望aBuf在函數返回後被真實文本填充。
這是所有在Java 7 64位Windows 7上運行。該DLL是一個32位的DLL。
更新及解決方法:
謝謝大衛和Rob您的意見。我已將delphi定義更改爲使用stdcall聲明。調用該函數現在返回它應該的值。要檢索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));
}
如果這真的是機器代碼,那麼只有第一行是相關的。它跳過了後面的四條線,以解決057cb397。請展示更多。 –
你是對的,沒有看到,有什麼事情可以跳過這種說法,或者入口點在它下面?因爲調試器在倒數第二行中斷。我只是再次編輯它以使調試器中斷的地方更清晰。 – Alex