3

ObjectForScriptingを介してWebBrowserControlと対話するWinFormがあります。WinFormの基本クラスはComVisibleではなく、変更できないか、変更しません。NonComVisibleBaseClassがあるため、インターフェイスを作成してComVisible(true)に設定し、FormAttribute [ClassInterface(ClassInterfaceType.None)]を設定しました。インターフェイスのメソッドはJavaScriptで呼び出すことができます。そしてそれは完璧に機能します:

//Make the class visible for COM so we can set the ObjectForScripting
//Specify ClassInterfaceType.None to use the ComVisible Interface
[ComVisible(true)]
[ClassInterface(ClassInterfaceType.None)]
public partial class GeekBrowser : GeekBasePage, IMapControlInteractable
...
public class GeekBasePage : System.Windows.Forms.Form
...
[ComVisible(true)]
public interface IMapControlInteractable

しかし今、私の問題。インターフェイスには複数の機能が含まれています。個別のタスクグループ化のためにインターフェイスを分離したい。そのため、ロギング関数を含むインターフェースと、DataAccess関数などのインターフェースが必要です。

したがって、次のようになります。

[ComVisible(true)]
[ClassInterface(ClassInterfaceType.None)]
public partial class GeekBrowser : GeekBasePage, IDataAccess, ILogging
...
public class GeekBasePage : System.Windows.Forms.Form
...
[ComVisible(true)]
public interface IDataAccess
...
[ComVisible(true)]
public interface ILogging

しかし、これを行うと、2番目のインターフェイス(ILogging)の機能にJavascriptからアクセスできなくなります。インターフェイスの順序を切り替えると、IDataAccess関数にアクセスできなくなります。

したがって、Javascriptでは最初のインターフェイスのメソッドにのみアクセスできる場合があります。

各インターフェイスのすべての機能にアクセスできるようにするにはどうすればよいですか?繰り返しになりますが、BaseClassをComVisibleにし、ClassInterface属性を削除することは機能しますが、オプションではありません。

前もって感謝します!!

4

1 に答える 1

1

同様のプロジェクトを行ったとき、JavaScript は生成 COM ラッパーのデフォルト インターフェイスにしかアクセスできないことがわかりました。あなたのケースでは、デフォルト インターフェイスを明示的に設定していないため、最初に見つかった ComVisible インターフェイスをデフォルトとして選択しています。属性。問題は、JavaScript には QueryInterface の類似物がないことです。

他のインターフェイスにアクセスするには、JavaScript 用の QueryInterface の独自のバージョンを作成する必要があります。これには、デフォルトのインターフェイスで明示的なキャスト型関数を提供するか (それほどエレガントではありません)、正しい型への変換を実行できる別のオブジェクトを用意します。 ComVisible インターフェイス タイプ。

それが役立つことを願っています!

于 2011-08-23T16:08:36.323 に答える