【问题标题】:Js-ctypes third part dll with string return带有字符串返回的 Js-ctypes 第三方 dll
【发布时间】:2015-06-09 17:24:48
【问题描述】:

我正在使用用 C 语言制作的带有 js-ctypes 的 DLL。

该方法返回一个字符串,但是当我尝试访问指针内容时firefox崩溃了!

以下代码有效:

函数声明:

var getStr = lib.declare("getString", 
            ctypes.default_abi,
            ctypes.char.ptr,
            ctypes.int32_t
            );

函数调用:

let number = new ctypes.int32_t(1);
var str = getStr(number);
console.log(str.toString());
str.readString();

console.log 输出的:

ctypes.char.ptr(ctypes.UInt64("0x64ff5b48"))

但是这段代码不起作用:

函数声明:

var Core = {
    init : function(){
        this.lib = ctypes.open("library");
        this.getStr = this.lib.declare("getString",
                                       ctypes.default_abi,
                                       ctypes.char.ptr,
                                       ctypes.int32_t);
    },

    close : function(){
        this.lib.close();
    }

}

函数调用

Core.init();
var number = new ctypes.int32_t(1);
var result = Core.getStr(number);
console.log(result.toString());
result.readString();

console.log 输出的:

ctypes.char.ptr(ctypes.UInt64("0x64ff5b48"))

同样的事情!

这样 Firefox 就会崩溃。有谁知道如何解决这个问题?我这样做是为了调制插件。

【问题讨论】:

    标签: javascript firefox-addon jsctypes


    【解决方案1】:

    我发现了问题!谢谢诺伊达特。在第二个示例中,我在str.readString() 之前关闭了库。它使Firefox崩溃。我试图减少问题帖子中的代码并忘记了这个细节,对不起。

    【讨论】:

    • 很好的发现 :) 我不知道如果图书馆关闭 readString 会崩溃,这很有趣,感谢分享。
    • 我遇到了同样的问题,但是,它发生是因为我的本机代码在 JS 读取它之前释放了字符串。
    【解决方案2】:

    尝试像这样将str 转换为已知长度:var strCasted = ctypes.cast(str, ctypes.char.array(100).ptr); 然后尝试读取这样的字符串:var jsStr = strCasted.contents.readString(); 如果不跳转到#jsctypes moz 频道,这应该可以解决问题,我们将讨论它,然后在此处更新解决方案。将此粘贴到您的网址栏:irc://moznet/jsctypes

    这个关于铸造的教程应该会有所帮助:https://gist.github.com/Noitidart/081ef49002a90fe43005#comment-1470308

    【讨论】:

    • 谢谢诺伊达特。对不起,请在编辑后再次检查我的问题。现在所有的代码都在那里,我找到了是什么导致了 firefox 崩溃,但我不知道如何解决。
    • @Sabbathman 顺便说一句,你能在你的工作代码和非工作代码中告诉我什么是str.toString()我很好奇,谢谢
    • 哦,您必须在执行 .readString() 之前执行 .toString(),因为崩溃发生在 readString 处
    • kkkkk 我正在使用财务打印机 DLL。我不能这样做 str.toString().readString() 因为在此之后我的对象不是 CData 类型并且没有方法 readString()
    • 哦,请再次检查问题。 str.toString() 在这两种情况下都是相等的。
    猜你喜欢
    • 2012-03-09
    • 2018-12-02
    • 1970-01-01
    • 2018-08-18
    • 2012-09-08
    • 2021-08-04
    • 2013-12-26
    • 1970-01-01
    • 2013-08-29
    相关资源
    最近更新 更多