Имам достъп до DLL от JavaScript, използвайки JSCTypes. Трябва да получа данни чрез предаване на символен буфер към следния API,
__declspec(dllexport) WORD WINAPI receive( LPWORD lpwBufferSize,
LPSTR lpsBuffer);
Моят jsctypes изглежда така,
let receive = libs.dll.declare("receive",
ctypes.stdcall_abi,
ctypes.int32_t, // Return type - return code
ctypes.int32_t.ptr, // buffer size
ctypes.char.ptr, // Buffer
);
var bufferSize = new ctypes.int32_t(3000000).address(); //3000000
var buffer = new ctypes.char().address();
let rvopen = receive(bufferSize, buffer);
return buffer.readString()
С горния код можех да получа данни за първи път правилно, но xulrunner се срива при извикване на функция за получаване в следващите пъти. Опитах се да възпроизведа този проблем с общ DLL, наличен в Windows. Това хвърля изключение, неуловено изключение: TypeError: ctypes.char.array(500).address не е функция
var hostName = exports.getString = function() {
let lib = ctypes.open('Ws2_32.dll');
let gethostname = lib.declare("gethostname",
ctypes.default_abi,
ctypes.int,
ctypes.char.ptr,
ctypes.int);
var myArray = ctypes.char.array(500).address();
gethostname(myArray, 500);
return myArray.readString();
};
Ако изпусна извикването на API за адрес и го опитам както е показано по-долу,
var myArray = ctypes.char.array(64);
Сблъсквам се с този проблем, въпреки че в C++ масивите се считат за указатели.
'неуловено изключение: TypeError: очакван указател на тип, получен ctypes.char.array(640000)' във файл '' на ред 0, колона 0
Нямам достъп до изходния код на dll. Просто имам включващия файл (.h) за DLL. Аз съм разработчик на Java и не съм сигурен дали мога да отстранявам грешки без изходния код Всяка помощ се оценява!