1

我正在开发一个使用 ActiveX/COM 的浏览器插件,我正在尝试将 Javascript函数传递给方法调用,以便它可以用作回调。我已经能够获得分配给 ActiveX 对象上的属性的函数,但是由于该方法是异步的,因此对该方法的所有调用都必须共享相同的回调。

我已经看到了这个现有的 SO question,但我不确定这是否是完全相同的问题,因为我没有直接处理函数指针。

我们现在拥有的示例:

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); }
4

1 回答 1

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[] { });
于 2013-08-08T22:52:43.980 回答