Javascript 如何调用C++;来自firefox插件/js ctypes的类实例? 我有一个DLL(用C++代码那样):< /P> 这是用C++调用的,类似: MyObject MyObject((TYPEPERIPH)myTypePeriph); MyObject.GetTypePeriph(&result);

Javascript 如何调用C++;来自firefox插件/js ctypes的类实例? 我有一个DLL(用C++代码那样):< /P> 这是用C++调用的,类似: MyObject MyObject((TYPEPERIPH)myTypePeriph); MyObject.GetTypePeriph(&result);,javascript,c++,firefox-addon,jsctypes,Javascript,C++,Firefox Addon,Jsctypes,我想用js ctypes调用此DLL: Components.utils.import("resource://gre/modules/ctypes.jsm"); var dll = ctypes.open("my.dll"); var constructor = dll.declare('MyObject', ctypes.default_abi, ctypes.voidptr_t, ctypes.uint8_t ); var ptr=constructor( 1

我想用js ctypes调用此DLL:

Components.utils.import("resource://gre/modules/ctypes.jsm");
var dll = ctypes.open("my.dll");

var constructor = dll.declare('MyObject',
    ctypes.default_abi,
    ctypes.voidptr_t,
    ctypes.uint8_t
);

var ptr=constructor( 1 ) // ptr seems to be a pointer to an instance

// but how to call this instance ?? should I pass the ptr somewhere ?
var GetTypePeriph = dll.declare('GetTypePeriph',
    ctypes.default_abi,
    ctypes.int,
    ctypes.uint8_t.ptr
);

var result=ctypes.uint8_t(0);
GetTypePeriph(result.address());
myPerif= result.value;

第一部分工作(^^)。。。“ptr”似乎是一个有效的指针。但是我不知道如何用这个指针调用instance方法…

您必须定义VTABLE,然后创建一个实例,请参见此处-

上周我还用js ctypes做了一些COM,我在Windows上使用DirectShow API-

VTBLE方法必须正常!!我花了两个月的时间才弄清楚我是什么时候开始的

下面是我做的一堆COM东西的定义:

我编辑了您的代码,使其看起来更像:

Components.utils.import("resource://gre/modules/ctypes.jsm");
var dll = ctypes.open("my.dll");

var MyConstructorVtbl = ctypes.StructType('MyConstructorVtbl');
var MyConstructor = ctypes.StructType('MyConstructor', [
    { 'lpVtbl': MyConstructorVtbl.ptr }
]);
MyConstructorVtbl.define([
    {
        'GetTypePeriph': ctypes.FunctionType(ctyes.default_abi,
            ctypes.int, [           // return type
                MyConstructor.ptr,  // arg 1 HAS to be ptr to the instance EVEN though your C++ above doesnt show this. this is how it works.
                ctypes.uint8_t.ptr
            ]).ptr
    }
]);

var constructor = dll.declare('MyObject',
    ctypes.default_abi,
    MyConstructor.ptr.ptr,
    ctypes.uint8_t
);

var ptr=constructor( 1 ) // ptr seems to be a pointer to an instance
var instance = ptr.contents.lpVtbl.contents;

var result=ctypes.uint8_t(0);
instance.GetTypePeriph(ptr, result.address());
myPerif= result.value;

关于API在vtable中的顺序。。。它是否应该与类的公共方法相匹配?My.h从构造函数开始,然后是析构函数,第一个方法位于第三位。。。我是否也应该在vtable中声明它们(构造函数和析构函数)?提前谢谢这是一个很棒的问题@manatlan-我不确定。如果你能测试一下,让我知道那会很棒。测试的方法是测试ctypes vtable中定义的函数的返回值。如果它符合你的期望。对于测试,您可以强制中间函数返回
45
或其他内容。我确实知道,无论您的类继承什么方法,都必须是有序的。因此,如果它从一个名为
IUknown
的对象继承方法,您可以查看该类并按照它们在
IUnknown
中的顺序首先列出这些方法-(…我在努力,努力;-)我努力,努力。。。我已经做了很多firefox崩溃;-)我想取消。。。在我最后一次尝试中,我尝试了,它就像一个符咒!伟大的谢谢你的耐心!嘿@manatlan你能展示一下你是如何使用jscpptypes的吗?我非常有兴趣学习如何使用它。
Components.utils.import("resource://gre/modules/ctypes.jsm");
var dll = ctypes.open("my.dll");

var MyConstructorVtbl = ctypes.StructType('MyConstructorVtbl');
var MyConstructor = ctypes.StructType('MyConstructor', [
    { 'lpVtbl': MyConstructorVtbl.ptr }
]);
MyConstructorVtbl.define([
    {
        'GetTypePeriph': ctypes.FunctionType(ctyes.default_abi,
            ctypes.int, [           // return type
                MyConstructor.ptr,  // arg 1 HAS to be ptr to the instance EVEN though your C++ above doesnt show this. this is how it works.
                ctypes.uint8_t.ptr
            ]).ptr
    }
]);

var constructor = dll.declare('MyObject',
    ctypes.default_abi,
    MyConstructor.ptr.ptr,
    ctypes.uint8_t
);

var ptr=constructor( 1 ) // ptr seems to be a pointer to an instance
var instance = ptr.contents.lpVtbl.contents;

var result=ctypes.uint8_t(0);
instance.GetTypePeriph(ptr, result.address());
myPerif= result.value;