【问题标题】:Javascript String to C++ char pointer -LPSTR buffer in JSCTypesJavascript 字符串到 C++ 字符指针 -JSCTypes 中的 LPSTR 缓冲区
【发布时间】:2011-08-04 05:26:03
【问题描述】:

我正在使用 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 is not a function

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: 预期类型指针,在文件 '' 第 0 行第 0 列得到 ctypes.char.array(640000)'

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

【问题讨论】:

    标签: firefox-addon mozilla libffi chromeless jsctypes


    【解决方案1】:

    终于找到解决办法了,

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

    和函数原型是一样的

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

      • 我仍然无法解决它。数组不支持 address() api。有什么想法!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多