`

历史最全的C#开发ActiveX

    博客分类:
  • C#
 
阅读更多

--资料来源互联网

 

第一步:创建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:已经可以开始测试了。

 

 

  • 大小: 101.6 KB
  • 大小: 18.2 KB
  • 大小: 84.5 KB
  • 大小: 79.4 KB
  • 大小: 23.9 KB
  • 大小: 14.7 KB
分享到:
评论

相关推荐

    C#开发ActiveX控件

    总的来说,虽然C#开发ActiveX控件在当今的Web开发环境中可能并不常见,但这项技术对于理解COM组件和浏览器插件的历史以及.NET与COM的交互具有一定的学习价值。对于需要在特定环境下使用ActiveX的项目,掌握这种开发...

    C# activeX控件开发Demo

    在本“C# activeX控件开发Demo”中,我们将深入探讨如何利用C#语言来创建和使用ActiveX控件。 ActiveX是微软推出的一种技术,主要用于构建基于Internet Explorer的Web应用和桌面应用。它基于COM(Component Object ...

    使用C#开发ActiveX控件

    虽然C++和Visual Basic(VB)通常是开发ActiveX控件的首选语言,但随着C#的普及,使用C#开发ActiveX控件已经成为可能。 在C#中创建ActiveX控件,首先需要建立一个WinForm的UserControl工程。UserControl是.NET ...

    ActiveX技术综述,VisualC++5.0,C#对ActiveX的支持,用VC5.0开发ActiveX控制,ActiveX控制在WEB上的应用,ActiveXSDK,

    总的来说,ActiveX技术是早期Web开发中增强交互性和功能的重要手段,尽管现在它的使用已经不如以前广泛,但对于理解早期互联网技术的历史和COM组件的原理仍然有重要的价值。Visual C++ 5.0和C#对ActiveX的支持展示了...

    C#编写activex控件

    然而,随着.NET框架的发展,C#作为一门更现代、更强大的编程语言,也能够用于开发ActiveX控件。 在C#中编写ActiveX控件,你需要借助.NET框架的COM互操作性特性。以下是一步步创建一个简单的C# ActiveX控件的步骤: ...

    VS2008 C#ActiveX控件的开发

    VS2008提供了一个强大的开发环境,支持C#编程语言,使得开发ActiveX控件变得更加便捷。 在C#中开发ActiveX控件的步骤通常包括以下几个方面: 1. **创建项目**:首先,你需要在VS2008中创建一个新的类库项目。由于...

    c#来制作的一个activeX控件

    在IT行业中,ActiveX控件是一种在Windows操作系统上运行的软件组件,主要由Microsoft开发,用于Web应用...对于初学者来说,了解ActiveX的原理和创建过程仍然有价值,因为它可以帮助理解COM组件和客户端开发的历史背景。

    c# 编写activex控件 并与网页交互

    在IT行业中,ActiveX控件是一种在Windows操作系统中广泛使用的组件技术,主要应用于早期的互联网...虽然现代Web开发有更安全和跨平台的解决方案,但了解和掌握这种技术仍然对理解Web历史和某些特定场景的解决有帮助。

    C#设计的浏览器加载activex设计demo

    总的来说,虽然ActiveX技术在当前的Web开发环境中不那么常见,但它在历史上曾发挥了重要作用,为早期的互联网应用带来了丰富的交互性。对C#开发者来说,了解ActiveX控件的创建和使用有助于理解技术演进的过程,也有...

    C#视频插件制作,含源代码

    在IT行业中,C#是一种广泛使用的编程语言,尤其在开发Windows桌面应用、...虽然ActiveX在当前的Web开发中已逐渐被淘汰,但学习这种技术的历史和工作原理对于理解现代Web开发的演变过程和当前技术的由来依然具有价值。

    文件上传的activex控件

    在IT领域,ActiveX控件是一种在Internet Explorer浏览器中运行的软件组件,它允许开发者创建交互式的网页应用和...了解并掌握ActiveX控件的开发和使用,对理解过去互联网技术的历史以及应对旧系统的维护都是有益的。

    曲线显示ActiveX控件

    在IT行业中,ActiveX控件是一种在Windows操作系统中广泛使用的组件技术,由微软开发,用于在Web页面或桌面应用程序中嵌入功能丰富的交互式元素。标题提到的"曲线显示ActiveX控件"是指利用ActiveX技术来实现动态、...

    C#开发浏览器的例子

    对于初学者而言,C#开发浏览器是一个很好的学习项目,因为它涉及到网络通信、UI设计和多线程等关键概念。 首先,我们要明白,开发浏览器的基本组成部分包括用户界面(UI)、渲染引擎和网络通信模块。在C#中,我们...

    C#实现的WEB浏览器

    在IT领域,C#是一种广泛使用的编程语言,尤其在Windows应用程序和.NET框架的开发中。本项目名为"C#实现的WEB浏览器",意味着它利用C#的语言特性与.NET框架构建了一个能够浏览网页的应用程序。这样的浏览器通常是基于...

    ComponentOne Studio for ActiveX 2005 v3注册机

    ComponentOne Studio for ActiveX 2005 v3是一款针对ActiveX技术的开发工具套件,主要用于构建Windows应用程序。在2005年这个时间点,它提供了丰富的控件和组件,帮助开发者快速构建功能丰富的桌面应用。ActiveX是...

    ActiveX.zip_WEB开发_C#_

    在Web开发领域,ActiveX是一种由微软公司推出的控件技术,主要用于...尽管现代Web开发已经转向更加开放和安全的标准,但理解ActiveX和C#在历史上的作用及其工作原理,对于深入学习Web技术的历史和发展仍然是有价值的。

    用C#做的一个IE浏览器

    标题中的“用C#做的一个IE浏览器”表明这个项目是使用C#编程语言开发的一款基于Internet Explorer内核的网络浏览器。C#是一种面向对象的、现代的编程语言,由微软公司开发,广泛应用于Windows平台上的应用程序开发,...

    c#编写的Flash播放器,C#源代码程序

    在IT行业中,C#是一种广泛使用的编程语言,尤其在开发Windows桌面应用、游戏以及Web应用程序时。本项目涉及的是一个用C#...尽管Flash已不再流行,但这种用C#编写多媒体播放器的方法对于学习软件开发仍然具有启发意义。

    用C#编写网页小应用程序(Applet)

    总结来说,C#可以通过ActiveX控件或Silverlight实现类似Java Applet的网页小应用程序,但随着技术的进步,这些技术的使用已逐渐减少,更多的开发转向了基于浏览器的原生Web技术。对于初学者而言,理解这些技术的历史...

    海康威视web控件开发包

    4. **录像回放**:能够播放已录制的视频文件,便于查看历史监控记录。 5. **报警联动**:与海康威视的报警系统结合,当触发报警时,可以自动弹出相关摄像头的画面。 6. **事件管理**:支持设置事件规则,如移动侦测...

Global site tag (gtag.js) - Google Analytics