私は、COM と IE のアーキテクチャについて、危険であるというだけの十分な知識を持っていることを認めます。次のような C# .NET ActiveX コントロールが動作しています。
using System;
using System.Runtime.InteropServices;
using BrowseUI;
using mshtml;
using SHDocVw;
using Microsoft.Win32;
namespace CTI
{
public interface CTIActiveXInterface
{
[DispId(1)]
string GetMsg();
}
[ComVisible(true), ClassInterface(ClassInterfaceType.AutoDual)]
public class CTIActiveX : CTIActiveXInterface
{
/*** Where can I get a reference to SHDocVw.WebBrowser? *****/
SHDocVw.WebBrowser browser;
public string GetMsg()
{
return "foo";
}
}
}
regasm を使用してタイプ ライブラリを登録および作成しました。
regasm CTIActiveX.dll /tlb:CTIActiveXNet.dll /codebase
そして、これをjavascriptで正常にインスタンス化できます:
var CTIAX = new ActiveXObject("CTI.CTIActiveX");
alert(CTIAX.GetMsg());
CTIActiveX 内でクライアント サイト(ブラウザ ウィンドウ)への参照を取得するにはどうすればよいですか。IObjectWithSite を実装して BHO でこれを実行しましたが、これが ActiveX コントロールの正しいアプローチだとは思いません。Javascript でインスタンス化しようとしたときに CTIActiveX にインターフェイス (IObjectWithSite のような COM インターフェイスを意味します) を実装すると、オブジェクトが自動化をサポートしていないというエラーが表示されます。