У меня есть библиотека DLL С++ с предоставленными файлами заголовков без реализации. И я реализую вызов JNA для функций этой библиотеки. А у меня проблема только с 1 функцией (другая, даже похожая работает нормально). Это объявление из файла .h:
int CALLINGCONV SMIMESignML(
const char* pin,
unsigned long slot,
const char* szOutputFilePath,
const char* szFrom,
const char* szTo,
const char* szSubject,
const char* szOtherHeaders,
const char* szBody,
const char* szAttachments,
unsigned long dwFlags,
int bInitialize
);
Java-код:
public interface Dll extends StdCallLibrary {
public String JNA_LIBRARY_NAME = "libname.dll";
int SMIMESignML(String pPin, int slot, String pOut, String pFrom, String pTo,
String pSubject, String pHeaders, String pBody, String pAttachments, int flags,
int init);
}
public class Test {
private static final Dll dll = (Dll) Native.loadLibrary(Dll.JNA_LIBRARY_NAME, Dll.class, W32APIOptions.ASCII_OPTIONS);
public static void main(String[] args) {
String pOut = "";
String pFrom = "";
String pTo = "";
String pBody = "";
String pAttachments = "";
int code = dll.SMIMESignML(null, 0, pOut, pFrom, pTo, null, null, pBody, pAttachments, 0, 0);
System.out.println(code);
}
}
Функция должна возвращать разные коды ошибок типа int, но всегда возвращает код 0xFFFF.
Я могу проверить это тем же кодом на Паскале:
unit dll;
interface
const
JNA_LIBRARY_NAME = 'libname.dll';
function SMIMESignML(pPin: PChar; slot: integer; pOut: PChar; pFrom: PChar; pTo: PChar;
pSubject: PChar; pHeaders: PChar; pBody: PChar; pAttachments: PChar; flags: integer;
init: integer): integer; stdcall; external JNA_LIBRARY_NAME;
implementation
end.
program Hello;
uses dll;
var
code: integer;
begin
code := SMIMESignML(nil, 0, '', '', '', nil, nil, '' , '', 0, 0);
writeln(code);
end.
Код Pascal возвращает 2, код Java возвращает 65535. Более того, вызовы Pascal std работают правильно, изменяя аргументы, мы получаем разные коды ошибок (0=OK и другие), но Java с теми же аргументами не работает, он всегда возвращает 0xFFFF. Как я могу отладить его, чтобы понять проблему?
P.S. Более того, в этой же библиотеке у меня есть эта функция и она без проблем работает из JNA:
int CALLINGCONV PKCS7SignML(
const char *pin,
unsigned long slot,
const char* szInputFileName,
const char* szOutputFileName,
int bInitialize);
ОС Win8 x64, JavaOracle7x86, библиотека x32. «unsigned long» не должно быть проблемой, так как в Windows оно должно быть 4 байта.
Что я делаю неправильно, если один и тот же вызов STD возвращает разные результаты в этих двух примерах? И как я могу отладить это?
W32API.DEFAULT_OPTIONS
, который использует широкие (Unicode) строки (wchar_t*
в нативном). Вместо этого вам нужно использоватьASCII_OPTIONS
. - person technomage   schedule 17.07.2015ASCII_OPTIONS
решил вашу другую проблему? Однако это не объясняет, почемуC
не удается получить доступ. - person technomage   schedule 17.07.2015