6 .net c# internet-explorer activex
我承认我对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";
}
}
}
Run Code Online (Sandbox Code Playgroud)
我使用regasm注册并创建了一个类型库:
regasm CTIActiveX.dll /tlb:CTIActiveXNet.dll /codebase
Run Code Online (Sandbox Code Playgroud)
并且可以在javascript中成功实例化:
var CTIAX = new ActiveXObject("CTI.CTIActiveX");
alert(CTIAX.GetMsg());
Run Code Online (Sandbox Code Playgroud)
如何在CTIActiveX中获取对客户端站点(浏览器窗口)的引用?我通过实现IObjectWithSite在BHO中完成了这个,但我不认为这是ActiveX控件的正确方法.如果我尝试在Javascript中实例化时在CTIActiveX上实现任何接口(我的意思是像IObjectWithSite这样的COM接口),我会收到一个错误,该对象不支持自动化.
首先,您的界面需要 ComVisible(true) 才能被调用脚本看到(这可能导致错误)。
其次,将项目中的 .NET 引用添加到“Microsoft.mshtml”。这将导入各种与 IE 相关的事物(窗口、HTML 文档等)的 COM 接口
然后,您需要将 IHtmlDocument2 类型的属性添加到您的界面:
IHtmlDocument2 Document { set; }
Run Code Online (Sandbox Code Playgroud)
...在你的班级中实现它:
public IHtmlDocument2 Document
{
set { _doc = value;}
}
Run Code Online (Sandbox Code Playgroud)
...从脚本中调用它
CTIAX.Document = document;
Run Code Online (Sandbox Code Playgroud)
...一旦存储了对文档的引用,您就可以随意使用它来访问窗口、其他框架或您希望的 HTML DOM 的任何部分。
| 归档时间: |
|
| 查看次数: |
5136 次 |
| 最近记录: |