zoukankan      html  css  js  c++  java
  • C#开发Activex控件(1)

    项目结构

    创建Activex步骤:

    1.选择创建类别(Windows 控件库或类库)

    2.设置对应的com属性


    AssemblyInfo.cs中须做以下设置:
    a.引入命名空间:using System.Security;
    b.[assembly: AllowPartiallyTrustedCallers()]



    3.生成的证书能正常在IE下安装,需继承IObjectSafety,考虑到所有的生成的证书都需继承自该接口,需写一个基类,代码如下:
    a.接口代码:

    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.Runtime.InteropServices;
    
    namespace LamSoonActivex
    {
        [ComImport, Guid("CB5BDC81-93C1-11CF-8F20-00805F2CD064")]
        [InterfaceType(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);
        }
    }
    View Code

    b.基类代码

    using System;
    using System.Collections.Generic;
    using System.Text;
    
    using System.Runtime.InteropServices;
    using System.Windows.Forms;
    
    namespace LamSoonActivex
    {
    
        public class BaseActivex : UserControl, IObjectSafety
        {
            private Sunisoft.IrisSkin.SkinEngine skinEngine1;
    
            #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)
            {
                //pdwSupportedOptions = 1;
                //pdwEnabledOptions = 2;
                //throw new Exception("The method or operation is not implemented.");
                //以上代码亦能正常运行,SetInterfaceSafetyOptions设置即可
    
    
                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)
            {
                //throw new Exception("The method or operation is not implemented.");
                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 InitializeComponent()
            {
                this.skinEngine1 = new Sunisoft.IrisSkin.SkinEngine(((System.ComponentModel.Component)(this)));
                this.SuspendLayout();
                // 
                // skinEngine1
                // 
                this.skinEngine1.SerialNumber = "";
                this.skinEngine1.SkinFile = "\Resources\SportsBlue.ssk";//null;
                // 
                // BaseActivex
                // 
                this.Name = "BaseActivex";
                this.Load += new System.EventHandler(this.BaseActivex_Load);
                this.ResumeLayout(false);
    
            }
    
            private void BaseActivex_Load(object sender, EventArgs e)
            {
                //skinEngine1.SkinFile = LamSoonActivex.Properties.Resources.l.ssk;// @"ResourcesSportsBlue.ssk";
            }
        }
    }
    View Code

    4.证书编码

    a.需在证书的[Guid("527A380F-7E26-4fd3-AEA5-010D3E7B73BE")],是在Web页中调用的Id,必须是唯一
    b.须引入命名空间 using System.Runtime.InteropServices;

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Drawing;
    using System.Data;
    using System.Text;
    using System.Windows.Forms;
    
    using System.Runtime.InteropServices;
    
    namespace LamSoonActivex
    {
        [Guid("527A380F-7E26-4fd3-AEA5-010D3E7B73BE")]
        public partial class FrmLamSoon : BaseActivex
        {
            public FrmLamSoon()
            {
                InitializeComponent();
            }
    
            private void btnLogin_Click(object sender, EventArgs e)
            {
                if (txtStaff_Id.Text.Length == 0 || txtPwd.Text.Length == 0)
                {
                    MessageBox.Show("请输入有效的系统登陆信息!", "系统提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    return;
                }
            }
        }
    }
    View Code


    5.Web UI调用

    2种调用方式:
    
    <object id="helloworld" 
                classid="clsid:527A380F-7E26-4fd3-AEA5-010D3E7B73BE" 
                codebase="LamSoonActivex.exe">
            </object>
    
    <object id="helloworld" 
                classid="clsid:527A380F-7E26-4fd3-AEA5-010D3E7B73BE" 
                codebase="LamSoonActivex.cab#version=1,0,1,0">
            </object>
    View Code

     示例:

    <html xmlns="http://www.w3.org/1999/xhtml" >
    <head runat="server">
        <title>TestActivex</title>
    </head>
    <body>
        <form id="form1" runat="server">
        <div style=" text-align:center">
            
            <object id="activex_test" 
                classid="clsid:527A380F-7E26-4fd3-AEA5-010D3E7B73BE" 
                codebase="LamSoonActivex.cab#version=1,0,1,0">
            </object>
            
        </div>
        </form>
    </body>
    </html>
    View Code
  • 相关阅读:

    模块
    18 安装kali系统
    17 部署靶机环境下
    16 部署靶机环境上
    15 部署win2003和IIS服务
    Spring详解(十一)----Bean 的作用域
    Spring详解(十)----使用@Configuration与@Bean注解装配Bean
    Spring详解(九)----Spring Bean的自动装配(基于注解的方式【推荐】)
    Spring详解(八)----Spring Bean的装配(基于注解的方式【推荐】)
  • 原文地址:https://www.cnblogs.com/myjacky/p/3460063.html
Copyright © 2011-2022 走看看