Строка Javascript для указателя символа C++ -буфер 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);

Я сталкиваюсь с этой проблемой, хотя в С++ массивы считаются указателями.

'неперехваченное исключение: 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
Я до сих пор не могу решить это. address() API не поддерживается для массивов. Есть идеи! - person Yeshvanthni; 07.08.2011