COM通函数指针(代表)作为方法参数对ActiveX对象(在C#实现的)(COM pass func

2019-10-18 11:43发布

我正在使用的ActiveX / COM一个浏览器插件,我试图通过JavaScript 函数方法调用,以便它可以被用作一个回调。 我已经能够获得分配给该ActiveX对象上的属性的功能,但由于该方法是异步方法的所有调用必须共享相同的回调。

我已经看到了这个现有的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); }

Answer 1:

假设该ActiveX在C ++进行编码,JavaScript函数对象将被传递到ActiveX方法IDispatch接口指针。 回拨这个JavaScript函数,你需要坚持这种干扰和调用IDispatch::Invoke(DISPID_VALUE, ...)当任务完成。 传递给所有PARAMS 调用将被传递给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[] { });


文章来源: COM pass function pointer (delegate) as a method parameter to ActiveX object (implemented in C#)
标签: c# com activex