JNA을 사용하여 델파이 DLL에서 함수를 호출하려고합니다. 함수 정의는 다음과 같습니다jna 핸들 및 문자열에서 delphi/pascal dll 함수 매핑
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 레지스터로 이동한다고 생각합니다. edx가 0이되도록 ebp-8이 값 0을 가리킴. edx가 가리키는 주소로 eax를 이동합니다. 0을 움직여서 모든 것이 깨지지 않도록해야하나요?
내 인수가 함수에 올바르게 전달되지 않는 이유는 무엇입니까? 이전 호출과 동일한 DLL에서 aHandle을 얻었으므로 aBuf를 으로 설정합니다. WString aBuf = 새 WString ("placeholderstring"); 함수가 반환 된 후 aBuf가 실제 텍스트로 채워질 것으로 예상합니다.
이것은 모두 Java 7 64 비트가 설치된 Windows 7에서 실행됩니다. DLL은 32 비트 DLL입니다.
UPDATE 및 솔루션 :
당신의 의견을 당신에게 다윗과 롭 감사드립니다. Delphi 정의를 stdcall 선언을 사용하도록 변경했습니다. 함수를 호출하면 이제 0을 반환합니다. (내 생각)
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을 처리하기 위해 4 개의 연속 라인을 넘어서 점프. 더 보여주세요. –
당신 말이 맞습니다. 저것을 보지 못했습니다. 진술을 뛰어 넘기 위해 어떤 일이 일어나거나 진입 점이 그 아래에 있어야합니다. 왜냐하면 디버거는 두 번째 행에서 마지막 행으로 분리되기 때문입니다. 방금 디버거가 중단 된 부분을 명확하게하기 위해 다시 편집했습니다. – Alex