C#创建ActiveX

一、目标

  创建一个Demo,使用C#创建ActiveX达到屏幕截图并展示图片的效果。

二、步骤

  1. 使用Visual Studio创建一个Class Libary项目

  

  2. 向Project中Add一个New Item -> Interface,命名为IObjectSafety.cs,代码如下

namespace IEActiveX
{
    //为了让ActiveX控件获得客户端的信任,控件类需要实现一个名为“IObjectSafety”的接口。先创建该接口(注意,不能修改该接口的GUID值)
    [ComImport,Guid("CB5BDC81-93C1-11CF-8F20-00805F2CD064")]
    [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
    public 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);
    }
}

  3. 向Project中Add一个User Control...,命名为ScreenCapture.cs,代码如下

  注意使用Guid工具生成下面的Guid

namespace IEActiveX
{
  [Guid("84F44957-3A18-4B1B-96BB-9D7D1D7B577E")] //使用VS工具里的GUID生成器生成唯一码
    public partial class ScreenCapture : UserControl,IObjectSafety
    {
        public ScreenCapture()
        {
            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, [MarshalAs(UnmanagedType.U4)] ref int pdwSupportedOptions, [MarshalAs(UnmanagedType.U4)] ref int pdwEnabledOptions)
        {
            int result = E_FAIL;

            string strGuid = riid.ToString("B");
            pdwEnabledOptions = INTERFACESAFE_FOR_UNTRUSTED_CALLER | INTERFACESAFE_FOR_UNTRUSTED_DATA;
            switch (strGuid)
            {
                case _IID_IDispatch:
                case _IID_IDispatchEx:
                    result = S_OK;
                    pdwEnabledOptions = 0;
                    if (_fSafeForScripting)
                        pdwEnabledOptions = INTERFACESAFE_FOR_UNTRUSTED_CALLER;
                    break;
                case _IID_IPersistStorage:
                case _IID_IPersistStream:
                case _IID_IPersistPropertyBag:
                    result = S_OK;
                    pdwEnabledOptions = 0;
                    if (_fSafeForInitializing)
                        pdwEnabledOptions = INTERFACESAFE_FOR_UNTRUSTED_DATA;
                    break;
                default:
                    result = E_NOINTERFACE;
                    break;
            }
            return result;
        }

        public int SetInterfaceSafetyOptions(ref Guid riid, [MarshalAs(UnmanagedType.U4)] int dwOptionSetMask, [MarshalAs(UnmanagedType.U4)] int dwEnabledOptions)
        {
            int result = E_FAIL;

            string strGuid = riid.ToString("B");
            switch (strGuid)
            {
                case _IID_IDispatch:
                case _IID_IDispatchEx:
                    if (((dwEnabledOptions & dwOptionSetMask) == INTERFACESAFE_FOR_UNTRUSTED_CALLER) && _fSafeForScripting)
                        result = S_OK;
                    break;
                default:
                    result = E_NOINTERFACE;
                    break;
            }
            return result;
        }
        #endregion

        public string PrintScreen()
        {
            Image baseImage = new Bitmap(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height);
            Graphics g = Graphics.FromImage(baseImage);
            g.CopyFromScreen(new Point(0, 0), new Point(0, 0), Screen.AllScreens[0].Bounds.Size);
            g.Dispose();
            baseImage.Save("D:\\screen.jpg", ImageFormat.Jpeg);
            Stream file = new FileStream("D:\\screen.jpg", FileMode.Open);
            BinaryReader bw = new BinaryReader(file);
            var buffer = new byte[file.Length];
            bw.Read(buffer, 0, buffer.Length);
            bw.Close();
            string b64 = Convert.ToBase64String(buffer);
            return b64;
        }
    }
}

  4. 设置Project属性,

    Application => "Make assembly COM-Visible"(使程序集COM可见)

    Build =>"Register for COM interop"(为COM互操作注册)

  

  

  5. 生成该解决方案,该ActiveX会注册到系统Register

  6. 在Web中调用该ActiveX

  注意下面的CLASSID="clsid:84F44957-3A18-4B1B-96BB-9D7D1D7B577E"> 必须和上面自己生成的一致

<!DOCTYPE html>
<html>
  <head>
    <title>Testing</title>

    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
    <meta http-equiv="description" content="this is my page">
    <meta http-equiv="content-type" content="text/html; charset=UTF-8">
    <script>
        function jt(){
             var str="";
             try
             {
                var obj = document.getElementById("IEActiveX");
                 str=obj.PrintScreen();
             }
             catch(e)
            {
                alert(e);
                return;
            }

             var img=document.getElementById("img");
             img.src="data:image/jpeg;base64,"+str;//接受base64编码后的图片
        }
    </script>
  </head>

  <body>
      <OBJECT ID="IEActiveX" WIDTH="120" HEIGHT=20" CLASSID="clsid:84F44957-3A18-4B1B-96BB-9D7D1D7B577E"></OBJECT>
      <input type="button" value="ScreenCapture" onclick="jt();">
    <Image id ="img" />
  </body>
</html>

三、运行结果

时间: 2024-10-06 00:22:40

C#创建ActiveX的相关文章

使用VS2012创建ActiveX控件

最近接到一个小项目,要求编写一个ActiveX控件嵌入IE运行.查了下资料,Delphi要求先制作VCL控件,然后从VCL控件生成ActiveX控件:VC查到的都是vc6.0下面的创建步骤,向导创建完代码后,使用类向导添加控件的属性和方法: Automation 选项中添加方法和属性会自动在接口和控件源代码中生成相应的代码,如果是私有(自定义)的方法不需要暴露给接口的,可以手工添加生成. 但是到了VS2012中,类向导中没有了这个Automation选项卡,再此只能添加变量和方法函数,并且也不能

C++ 使用VS2010创建MFC ActiveX工程项目

1.ActiveX的基本概念 ActiveX控件可以看作是一个极小的服务器应用程序,它不能独立运行,必须嵌入到某个容器程序中,与该容器一起运行.这个容器包括WEB网页,应用程序窗体等... ActiveX控件的后缀名是OCX或者DLL.一般是以OCX和动态库共存的形式打包成cab或者exe的文件放在服务器上,客户端下载后运行安装cab或exe解压成OCX和动态库共存的文件,然后注册ocx文件. ActiveX控件是基于com标准,使得软件部件在网络环境中进行交互的技术集.它与具体的编程语言无关.

c++ ActiveX基础1:使用VS2010创建MFC ActiveX工程项目

1.ActiveX的基本概念 ActiveX控件可以看作是一个极小的服务器应用程序,它不能独立运行,必须嵌入到某个容器程序中,与该容器一起运行.这个容器包括WEB网页,应用程序窗体等... ActiveX控件的后缀名是OCX或者DLL.一般是以OCX和动态库共存的形式打包成cab或者exe的文件放在服务器上,客户端下载后运行安装cab或exe解压成OCX和动态库共存的文件,然后注册ocx文件. ActiveX控件是基于com标准,使得软件部件在网络环境中进行交互的技术集.它与具体的编程语言无关.

ActiveX控件(MFC篇)

目录 第1章 VC++6.0创建控件    1 1.1 目标    1 1.1.1 方法    1 1.1.2 属性    1 1.1.3 事件    1 1.2 创建项目    2 1.3 项目结构    6 1.3.1 COM接口    6 1.3.2 COM类    7 1.3.3 属性页    7 1.3.4 应用程序类    8 1.3.5 注册与注销    8 1.4 方法    9 1.4.1 增加    9 1.4.2 删除    11 1.5 属性    12 1.5.1 Te

ActiveX相关

ActiveX 1.创建ActiveXhttp://blog.csdn.net/fww330666557/article/details/6533118 继承IObjectSafety接口http://blog.csdn.net/serverxp/article/details/5567233 2.安装ActiveX cabarc N C:\test.cab C:\softphone.dll C:\test.inf 将Activex打成CAB文件http://blog.csdn.net/suhe

Delphi 编写ActiveX控件(OCX控件)的知识和样例(有详细步骤)

一.ActiveX应用情况简介: ActiveX控件也就是一般所说的OCX控件,它是 ActiveX技术的一部分.ActiveX是微软公司推出的基于组件对象模型COM的技术,包括对Windows 32位应用编程接口(Win32 API)和组件对象模型的一系列扩充和增强,目标是把计算机桌面环境与因特网环境集成起来,同时保护在Windows技术中现有的开发投资.微软的 ActiveX技术根本上就是修改过的OCX技术,使它能够跨越Internet,主要是使用WWW来传递控件.            A

C# 做ActiveX控件问题

创建ActiveX控件: 1. 新建项目“Windows控件库”,从项目中删除UserControl1.cs,新建“用户控件”项并指定名称. 2. 打开项目属性,在“生成”标签页中选中“为COM Interop注册”. 3. 打开Properties中的AssenblyInfo.cs,修改[assembly: ComVisible(false)],将false改为true,否则编译会出现“不包含可为COM Interop注册(注销)的任何类型”警告. 4. 编译. 创建网页: 1. 新建ASP.

在Qt中使用ActiveX控件

Qt的windows商业版本提供了ActiveQt这个framework,使用这个组件我们可以在Qt中使用ActiveX控件,并且也开发基于Qt的ActiveX控件.ActiveQt包含了两个组件QAxContainer和QAxServer. l         QAxContainer允许我们使用COM对象,并且可以将将ActiveX控件嵌入到Qt程序中去. l         QAxServer可以将我们写的Qt控件导出为COM对象或者是ActiveX控件. 第一个例子我们来演示一下在Qt中

delphi7 开发ActiveX的学习备忘录

原文来自: delphi7 开发ActiveX的学习备忘录 关于delphi7 ActiveX的学习备忘 Author :5caidm ,2008-06-12 步骤: 1.先创建ActiveX工程文件: 2.注册ActiveX文件(ocx文件) : 3.编写相应调用ActiveX文件(.ocx文件)的html文件. 具体操作流程如下: 步骤1: a.选择File->New->Other ,ActiveX页面,选择ActiveX Form : b.填写New ActiveX Name:,其他的不