--资料来源互联网
第一步:创建C#类库项目,修改“名称”为HuaYun.ActiveX
第二步:修改AssemblyInfo.cs,增加代码
//自定添加 [assembly: AllowPartiallyTrustedCallers()]
第三步:右键工程,“添加”-“用户控件”命名为“ActiveXControl.cs”
第四步:按照第三步的方法添加接口IObjectSafety.cs
using System; using System.Collections.Generic; using System.Linq; using System.Runtime.InteropServices; using System.Text; namespace HuaYun.ActiveX { [ComImport, GuidAttribute("CB5BDC81-93C1-11CF-8F20-00805F2CD064")] [InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIUnknown)] interface IObjectSafety { [PreserveSig] int GetInterfaceSafetyOptions(ref Guid riid, [MarshalAs(UnmanagedType.U4)] ref int pdwSupportedOptions, [MarshalAs(UnmanagedType.U4)] ref int pdwEnabledOptions); [PreserveSig()] int SetInterfaceSafetyOptions(ref Guid riid, [MarshalAs(UnmanagedType.U4)] int dwOptionSetMask, [MarshalAs(UnmanagedType.U4)] int dwEnabledOptions); } }
第五步:添加调用JS的接口IOleClientSite.cs,IOleContainer.cs
using System; using System.Collections.Generic; using System.Linq; using System.Runtime.InteropServices; using System.Text; namespace HuaYun.ActiveX { [ComImport,Guid("00000118-0000-0000-C000-000000000046"),InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] interface IOleClientSite { void SaveObject(); void GetMoniker(uint dwAssign, uint dwWhichMoniker, object ppmk); void GetContainer(out IOleContainer ppContainer); void ShowObject(); void OnShowWindow(bool fShow); void RequestNewObjectLayout(); } }
using System; using System.Collections.Generic; using System.Linq; using System.Runtime.InteropServices; using System.Text; namespace HuaYun.ActiveX { [ComImport,Guid("0000011B-0000-0000-C000-000000000046"),InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIUnknown)] interface IOleContainer { void EnumObjects([In, MarshalAs(UnmanagedType.U4)] int grfFlags, [Out, MarshalAs(UnmanagedType.LPArray)] object[] ppenum); void ParseDisplayName([In, MarshalAs(UnmanagedType.Interface)] object pbc, [In, MarshalAs(UnmanagedType.BStr)] string pszDisplayName, [Out, MarshalAs(UnmanagedType.LPArray)] int[] pchEaten, [Out, MarshalAs(UnmanagedType.LPArray)] object[] ppmkOut); void LockContainer([In, MarshalAs(UnmanagedType.I4)] int fLock); } }
第六步:编写ActiveXControl.cs代码,类上的GUID很关键这个就是“Object”的“classid”
ps:<object classid="clsid:de4479a4-af99-45b0-b0ce-d72bd4c2c37d" ></object>
using System; using System.Collections.Generic; using System.ComponentModel; using System.Drawing; using System.Data; using System.Linq; using System.Text; using System.Windows.Forms; using System.Runtime.InteropServices; using System.Reflection; using mshtml; namespace HuaYun.ActiveX { [Guid("21209360-34E1-423E-A81F-BC80B62021B7")] public partial class ActiveXControl : UserControl, IObjectSafety { public ActiveXControl() { InitializeComponent(); } #region IObjectSafety 成员 private const string _IID_IDispatch = "{00020400-0000-0000-C000-000000000046}"; private const string _IID_IDispatchEx = "{a6ef9860-c720-11d0-9337-00a0c90dcaa9}"; private const string _IID_IPersistStorage = "{0000010A-0000-0000-C000-000000000046}"; private const string _IID_IPersistStream = "{00000109-0000-0000-C000-000000000046}"; private const string _IID_IPersistPropertyBag = "{37D84F60-42CB-11CE-8135-00AA004BB851}"; private const int INTERFACESAFE_FOR_UNTRUSTED_CALLER = 0x00000001; private const int INTERFACESAFE_FOR_UNTRUSTED_DATA = 0x00000002; private const int S_OK = 0; private const int E_FAIL = unchecked((int)0x80004005); private const int E_NOINTERFACE = unchecked((int)0x80004002); private bool _fSafeForScripting = true; private bool _fSafeForInitializing = true; public int GetInterfaceSafetyOptions(ref Guid riid, ref int pdwSupportedOptions, ref int pdwEnabledOptions) { int Rslt = E_FAIL; string strGUID = riid.ToString("B"); pdwSupportedOptions = INTERFACESAFE_FOR_UNTRUSTED_CALLER | INTERFACESAFE_FOR_UNTRUSTED_DATA; switch (strGUID) { case _IID_IDispatch: case _IID_IDispatchEx: Rslt = S_OK; pdwEnabledOptions = 0; if (_fSafeForScripting == true) pdwEnabledOptions = INTERFACESAFE_FOR_UNTRUSTED_CALLER; break; case _IID_IPersistStorage: case _IID_IPersistStream: case _IID_IPersistPropertyBag: Rslt = S_OK; pdwEnabledOptions = 0; if (_fSafeForInitializing == true) pdwEnabledOptions = INTERFACESAFE_FOR_UNTRUSTED_DATA; break; default: Rslt = E_NOINTERFACE; break; } return Rslt; } public int SetInterfaceSafetyOptions(ref Guid riid, int dwOptionSetMask, int dwEnabledOptions) { int Rslt = E_FAIL; string strGUID = riid.ToString("B"); switch (strGUID) { case _IID_IDispatch: case _IID_IDispatchEx: if (((dwEnabledOptions & dwOptionSetMask) == INTERFACESAFE_FOR_UNTRUSTED_CALLER) && (_fSafeForScripting == true)) Rslt = S_OK; break; case _IID_IPersistStorage: case _IID_IPersistStream: case _IID_IPersistPropertyBag: if (((dwEnabledOptions & dwOptionSetMask) == INTERFACESAFE_FOR_UNTRUSTED_DATA) && (_fSafeForInitializing == true)) Rslt = S_OK; break; default: Rslt = E_NOINTERFACE; break; } return Rslt; } #endregion private void button1_Click(object sender, EventArgs e) { this.CallJavaScript("sex"); } private void ActiveXControl_Load(object sender, EventArgs e) { } // 被JS调用的ActiveX方法 public void SayHi(string msg) { MessageBox.Show(msg); } // 调用JS方法 private void CallJavaScript(string filename) { Type typeIOleObject = this.GetType().GetInterface("IOleObject", true); object oleClientSite = typeIOleObject.InvokeMember("GetClientSite",BindingFlags.Instance | BindingFlags.InvokeMethod | BindingFlags.Public, null,this,null); IOleClientSite oleClientSite2 = oleClientSite as IOleClientSite; IOleContainer pObj; oleClientSite2.GetContainer(out pObj); //参数数组 object[] args = new object[1]; args[0] = filename; //获取页面的Script集合 IHTMLDocument pDoc2 = (IHTMLDocument)pObj; object script = pDoc2.Script; try { //调用JavaScript方法OnScaned并传递参数,因为此方法可能并没有在页面中实现,所以要进行异常处理 script.GetType().InvokeMember("OnScaned",BindingFlags.Instance | BindingFlags.InvokeMethod | BindingFlags.Public, null, script, args); } catch { } } } }
ps:以上完成了编码工作,现在要生成项目,我使用的是VS2017没有安装部署工具需要在“工具”-“扩展和更新”找到“Mircrosoft Visual Studio 2017 Installer Projects”下载安装。
补充步骤:右键工程属性,“应用程序”-“程序集信息”勾选使程序集COM可见。“生成”勾选为COM互操作注册
第七步:创建安装项目命名为“TYacticeX”,ps:右键工程顶级菜单
第八步:修改工程属性,将“RemovePreviousVers”的值设置为True
第九步:右键安装项目,“Add”-“项目输出”-“主输出”,然后输出安装文件,一个exe和一个msi
第十步:开始写对应的html代码与JS代码
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <script type="text/javascript"> function OnScaned (filename){ document.getElementById("dx").value =filename; } </script> </head> <body> <label for="jsCall">js call ActiveX:</label> <button id="jsCall" onclick="csharpActiveX.SayHi('hello word');">call</button> <br/> <label for="dx">activeX call JS:</label> <input name="dx" id="dx" type="text" /> <object id="csharpActiveX" classid="clsid:21209360-34E1-423E-A81F-BC80B62021B7" codebase="lib/setup.exe" width="800" height="200" id="helloBossma"> </object> </body> </html>
ps:已经可以开始测试了。
相关推荐
总的来说,虽然C#开发ActiveX控件在当今的Web开发环境中可能并不常见,但这项技术对于理解COM组件和浏览器插件的历史以及.NET与COM的交互具有一定的学习价值。对于需要在特定环境下使用ActiveX的项目,掌握这种开发...
在本“C# activeX控件开发Demo”中,我们将深入探讨如何利用C#语言来创建和使用ActiveX控件。 ActiveX是微软推出的一种技术,主要用于构建基于Internet Explorer的Web应用和桌面应用。它基于COM(Component Object ...
虽然C++和Visual Basic(VB)通常是开发ActiveX控件的首选语言,但随着C#的普及,使用C#开发ActiveX控件已经成为可能。 在C#中创建ActiveX控件,首先需要建立一个WinForm的UserControl工程。UserControl是.NET ...
总的来说,ActiveX技术是早期Web开发中增强交互性和功能的重要手段,尽管现在它的使用已经不如以前广泛,但对于理解早期互联网技术的历史和COM组件的原理仍然有重要的价值。Visual C++ 5.0和C#对ActiveX的支持展示了...
然而,随着.NET框架的发展,C#作为一门更现代、更强大的编程语言,也能够用于开发ActiveX控件。 在C#中编写ActiveX控件,你需要借助.NET框架的COM互操作性特性。以下是一步步创建一个简单的C# ActiveX控件的步骤: ...
VS2008提供了一个强大的开发环境,支持C#编程语言,使得开发ActiveX控件变得更加便捷。 在C#中开发ActiveX控件的步骤通常包括以下几个方面: 1. **创建项目**:首先,你需要在VS2008中创建一个新的类库项目。由于...
在IT行业中,ActiveX控件是一种在Windows操作系统上运行的软件组件,主要由Microsoft开发,用于Web应用...对于初学者来说,了解ActiveX的原理和创建过程仍然有价值,因为它可以帮助理解COM组件和客户端开发的历史背景。
在IT行业中,ActiveX控件是一种在Windows操作系统中广泛使用的组件技术,主要应用于早期的互联网...虽然现代Web开发有更安全和跨平台的解决方案,但了解和掌握这种技术仍然对理解Web历史和某些特定场景的解决有帮助。
总的来说,虽然ActiveX技术在当前的Web开发环境中不那么常见,但它在历史上曾发挥了重要作用,为早期的互联网应用带来了丰富的交互性。对C#开发者来说,了解ActiveX控件的创建和使用有助于理解技术演进的过程,也有...
在IT行业中,C#是一种广泛使用的编程语言,尤其在开发Windows桌面应用、...虽然ActiveX在当前的Web开发中已逐渐被淘汰,但学习这种技术的历史和工作原理对于理解现代Web开发的演变过程和当前技术的由来依然具有价值。
在IT领域,ActiveX控件是一种在Internet Explorer浏览器中运行的软件组件,它允许开发者创建交互式的网页应用和...了解并掌握ActiveX控件的开发和使用,对理解过去互联网技术的历史以及应对旧系统的维护都是有益的。
在IT行业中,ActiveX控件是一种在Windows操作系统中广泛使用的组件技术,由微软开发,用于在Web页面或桌面应用程序中嵌入功能丰富的交互式元素。标题提到的"曲线显示ActiveX控件"是指利用ActiveX技术来实现动态、...
对于初学者而言,C#开发浏览器是一个很好的学习项目,因为它涉及到网络通信、UI设计和多线程等关键概念。 首先,我们要明白,开发浏览器的基本组成部分包括用户界面(UI)、渲染引擎和网络通信模块。在C#中,我们...
在IT领域,C#是一种广泛使用的编程语言,尤其在Windows应用程序和.NET框架的开发中。本项目名为"C#实现的WEB浏览器",意味着它利用C#的语言特性与.NET框架构建了一个能够浏览网页的应用程序。这样的浏览器通常是基于...
ComponentOne Studio for ActiveX 2005 v3是一款针对ActiveX技术的开发工具套件,主要用于构建Windows应用程序。在2005年这个时间点,它提供了丰富的控件和组件,帮助开发者快速构建功能丰富的桌面应用。ActiveX是...
在Web开发领域,ActiveX是一种由微软公司推出的控件技术,主要用于...尽管现代Web开发已经转向更加开放和安全的标准,但理解ActiveX和C#在历史上的作用及其工作原理,对于深入学习Web技术的历史和发展仍然是有价值的。
标题中的“用C#做的一个IE浏览器”表明这个项目是使用C#编程语言开发的一款基于Internet Explorer内核的网络浏览器。C#是一种面向对象的、现代的编程语言,由微软公司开发,广泛应用于Windows平台上的应用程序开发,...
在IT行业中,C#是一种广泛使用的编程语言,尤其在开发Windows桌面应用、游戏以及Web应用程序时。本项目涉及的是一个用C#...尽管Flash已不再流行,但这种用C#编写多媒体播放器的方法对于学习软件开发仍然具有启发意义。
总结来说,C#可以通过ActiveX控件或Silverlight实现类似Java Applet的网页小应用程序,但随着技术的进步,这些技术的使用已逐渐减少,更多的开发转向了基于浏览器的原生Web技术。对于初学者而言,理解这些技术的历史...
4. **录像回放**:能够播放已录制的视频文件,便于查看历史监控记录。 5. **报警联动**:与海康威视的报警系统结合,当触发报警时,可以自动弹出相关摄像头的画面。 6. **事件管理**:支持设置事件规则,如移动侦测...