1

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

1 に答える 1

1

IDispatchActiveX が C++ でコーディングされていると仮定すると、JavaScript 関数オブジェクトはインターフェイス ポインターとして ActiveX メソッドに渡されます。この JavaScript 関数をコールバックするには、その干渉を保持しIDispatch::Invoke(DISPID_VALUE, ...)、ジョブが完了したときに呼び出す必要があります。Invokeに渡されるすべてのパラメーターは、JavaScript 関数に渡されます。

EDITEDobject : コントロールが C# の場合、JavaScript 関数は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 に答える