Firefox addon Javascript字符串到C++;JSCTypes中的字符指针-LPSTR缓冲区

Firefox addon Javascript字符串到C++;JSCTypes中的字符指针-LPSTR缓冲区,firefox-addon,mozilla,libffi,chromeless,jsctypes,Firefox Addon,Mozilla,Libffi,Chromeless,Jsctypes,我使用JSCTypes从JavaScript访问DLL。我必须通过将字符缓冲区传递给以下API来接收数据 __declspec(dllexport) WORD WINAPI receive( LPWORD lpwBufferSize, LPSTR lpsBuffer); 我的JSC类型如下所示 let receive = libs.dll.declare("receive",

我使用JSCTypes从JavaScript访问DLL。我必须通过将字符缓冲区传递给以下API来接收数据

__declspec(dllexport) WORD WINAPI receive( LPWORD  lpwBufferSize,
                                           LPSTR   lpsBuffer);
我的JSC类型如下所示

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在随后的时间里在接收函数调用时崩溃。 我试图用windows上可用的公共DLL重现此问题。这引发了一个异常, 未捕获异常:TypeError:ctypes.char.array(500)。地址不是函数

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();
};
如果我放弃address API调用并按如下方式进行尝试

var myArray = ctypes.char.array(64);

我遇到这个问题,虽然C++中的数组被认为是指针。 “未捕获异常:TypeError:应为类型指针,在第0行第0列的文件“”中获取了ctypes.char.array(640000)”

我无法访问dll的任何源代码。我只有DLL的包含文件(.h)。我是一名Java开发人员,不确定是否可以在没有源代码的情况下进行调试
感谢您的帮助

如果我不得不猜测,我会说您需要将缓冲区分配到正确的大小。也许:

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

尝试使用在“receive”函数中设置断点的调试器,查看从JS传递的数据。

终于找到了解决方案

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

而且功能原型是一样的

我仍然无法解决它。数组不支持address()api。任何想法!