COM将函数指针(委托)作为方法参数传递给ActiveX对象(在C#中实现)

本文关键字:对象 ActiveX 实现 参数传递 函数 指针 委托 COM 方法 | 更新日期: 2023-09-27 18:26:59

我正在使用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); }

COM将函数指针(委托)作为方法参数传递给ActiveX对象(在C#中实现)

假设ActiveX是用C++编码的,则JavaScript函数对象将作为IDispatch接口指针传递给ActiveX方法。要调用回这个JavaScript函数,您需要抓住干扰,并在工作完成时调用IDispatch::Invoke(DISPID_VALUE, ...)。传递给Invoke的所有参数都将传递给JavaScript函数。

EDITED:如果控件在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[] { });