Javascript String to C ++ char指针-LPSTRype中的LPSTR缓冲区

时间:2011-08-04 05:26:03

标签: firefox-addon mozilla libffi chromeless jsctypes

我使用JSCTypes从JavaScript访问DLL。我必须通过将字符缓冲区传递给以下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在接下来的时间内在接收函数调用时崩溃。 我尝试使用Windows上可用的常见DLL重现此问题。抛出异常, 未捕获的异常: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行,col 0

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

2 个答案:

答案 0 :(得分:1)

终于找到了解决方案,

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

和函数原型相同

答案 1 :(得分:0)

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

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

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