我想要调用一个函数在德尔福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