Javascript String към C++ char указател -LPSTR буфер в JSCTypes

Имам достъп до 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 и не съм сигурен дали мога да отстранявам грешки без изходния код Всяка помощ се оценява!


person Yeshvanthni    schedule 04.08.2011    source източник


Отговори (2)


Най-накрая намерих решение,

<code>
 let charArray= ctypes.ArrayType(ctypes.char);
 let myArray = new charArray(500);      
</code>

и прототипът на функцията е същият

person Yeshvanthni    schedule 07.08.2011

Ако трябваше да гадая, бих казал, че трябва да разпределите буфера до правилния размер. Може би:

var buffer = new ctypes.char().array(3000000).address();

Опитайте да използвате дебъгер с точка на прекъсване, зададена във функцията "получаване", за да видите какви данни се предават от JS.

person Mark Finkle    schedule 05.08.2011
comment
Все още не мога да го реша. адрес() API не се поддържа за масиви. Някакви мисли! - person Yeshvanthni; 07.08.2011