我正在使用ActiveX / COM编写浏览器插件,并且我正在尝试将Javascript 函数传递给方法调用,以便可以将其用作回调。我已经能够在ActiveX对象上获得分配给属性的函数,但由于该方法是异步的,因此对该方法的所有调用必须共享相同的回调。
我已经看到了this现有的SO问题,但我不确定这是否是完全相同的问题,因为我没有直接处理函数指针。
我们现在:
的示例var obj = new MyComObject();
obj.Callback = function(id) { Console.log(id); }
obj.DoMethodCallAsync("someId");
obj.DoMethodCallAsync("someOtherId"); // Uses the same callback.
所需 API的示例:
var obj = new MyComObject();
obj.DoMethodCallAsync("someId", function(id) { Console.log("The first ID: " + id); }
obj.DoMethodCallAsync("someOtherId", function(id) { Console.log("The second ID: " + id); }
答案 0 :(得分:1)
假设ActiveX是用C ++编码的,JavaScript函数对象将作为IDispatch
接口指针传递给ActiveX方法。要回调此JavaScript函数,您需要保持干扰并在作业完成时调用IDispatch::Invoke(DISPID_VALUE, ...)
。传递给Invoke的所有参数都将传递给JavaScript函数。
已编辑:如果控件位于C#中,则JavaScript函数将作为object
传递给C#方法。它可以这样回叫:
callback.GetType().InvokeMember("[DispID=0]",
BindingFlags.InvokeMethod | BindingFlags.Instance | BindingFlags.Public,
null, callback, new object[] { });
AFAIR,会员名称也可以为空白:
callback.GetType().InvokeMember(String.Empty,
BindingFlags.InvokeMethod | BindingFlags.Instance | BindingFlags.Public,
null, callback, new object[] { });