zoukankan      html  css  js  c++  java
  • C#-Activex插件操作指南

    运行Microsoft Visual Studio 2005以上版本,新建解决方案如图

         

     给解决方案命名为:ActiveXTest

           

      为解决方案添加一个Windows 控件库项目,点击右键点击解决方案…

    并把控件库命名为ActiveX

    现在解决方案资源管理器的情况如图

    更改项目属性:右键点击“ActiveX”

    在VS 的工作区域出现了如下图的界面

    单击“程序集信息(I)…”弹出“程序及信息”如图3:勾选“使程序集COM 可见(M)”

    选择“生成”选项卡,并勾选“为COM 互操作注册(P)”如图:

    注意:此处是在debug 状态下修改的,如果是调到release 状态下,还需要再设置一下。

    修改AssemblyInfo.cs 文件如图

    引用命名空间:using System.Security;

    添加:[assembly: AllowPartiallyTrustedCallers()]

    AssemblyInfo.cs 文件添加后

    控件(UserControl1.cs)添加内容

    把UserControl1.cs 重命名为你需要的名字。这里我命名为:ActiveX。

    此ActiveX 主要包括一个Button 控件和一个TextBox 控件,Button 控件的Click 事

    件是弹出一个MessageBox 对话框,内容是TextBox 中的内容。再添加一个公共方

    法。

    这样做可以达到两个目的:

    目的一:添加一个方法,供B/S 前台程序直接调用,从而实现业务功能;

    目的二:ActiveX 控件可以提供B/S 程序UI 界面,可以响应B/S 程序中对UI

    的操作事件实现业务功能。

    为ActiveX.cs 添加命名空间:using System.Runtime.InteropServices;

    首先:为控件创建GUID,这个编号将用于B/S 系统的客户端调用时使用。

    创建方法:工具—>创建GUID(G)

    把GUID 复制下来,放在Activex.cs 类中:

    namespace ActiveX

    {

    [Guid("59EA8A50-4FC1-406a-A471-595247AB2E41")]

    public partial class UserControl1 : UserControl

    并添加Click 方法,和公共方法ForDefault()

    private void button1_Click(object sender, EventArgs e)

    {

    MessageBox.Show("您想说:"+this.textBox1.Text.ToString());

    }

    public string ForDefault()

    {

    return "此方法用于在前台调用,以表明前台页面可以用JS调用控

    件类中的方法!!!";

    }

    做到这一步之后,ActiveX 类的情况

    其次: 为了让ActiveX 控件获取客户端的信任, 控件类还需要实现一个名为

    “IObjectSafety”的接口。先创建该接口(注意:不能修改该接口的GUID 值)。

    using System;

    using System.Runtime.InteropServices;

    namespace ActiveX

    {

        #region

        [ComImport, GuidAttribute("CB5BDC81-93C1-11CF-8F20-00805F2CD064")]

        [InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIUnknown)]

        public interface IOjectSafety

        {

            [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);

        }

        #endregion

    }

    然后,在ActiveX 控件类中集成并实现接口:

    [Guid("59EA8A50-4FC1-406a-A471-595247AB2E41")]

    public partial class UserControl1 : UserControl,IobjectSafety

    并拷贝以下代码到ActiveX.cs 控件类中:

    #region 实现安w全Dt接Ó£g口f

            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

    这样,一个ActiveX 控件就开发完成了。

    打包與部署

    右键“解决方案”—>添加—>新建项目

    添加项目主输出

    设置Register 属性为vsdrpCOM

    方法:在解决方案中选中“主输出来自ActiveX( 活动)”

    生產下來的msi copy到工具一起運行那個後綴為bat的文件打包成cab放入web項目裏面就ok了.

    Aspx頁面引用代碼

    <object id="myObject1" classid="clsid:f0b99865-379c-4a3b-857b-97a60297bd01" codebase="Activex.cab#version=1.0.1"

            width="100%" height="100%">

        </object>

    Classid就是控件的GUID,codebase就是地址,#version就是與打包相同的版本

    到此所有步驟全夠結束.

    常見異常

    无法正确安装ActiveX插件。

    產生原因

    一.IE安全设置过高。

    二.IE未安装证书。

    解決方法

    一、IE安全设置过高

    点击IE的工具-选项-高级-ActiveX相关的都勾上就ok了

    二.IE未安装证书

    在进入ie时提示证书,把证书导入既可。

    转自:http://www.csaspx.com

  • 相关阅读:
    【第40套模拟题】【noip2011_mayan】解题报告【map】【数论】【dfs】
    【模拟题(63550802...)】解题报告【贪心】【拓扑排序】【找规律】【树相关】
    【模拟题(电子科大MaxKU)】解题报告【树形问题】【矩阵乘法】【快速幂】【数论】
    IMemoryBufferReference and IMemoryBufferByteAccess
    SoftwareBitmap and BitmapEncoder in Windows.Graphics.Imaging Namespace
    Windows UPnP APIs
    编译Android技术总结
    Windows函数转发器
    Two Ways in Delphi to Get IP Address on Android
    Delphi Call getifaddrs and freeifaddrs on Android
  • 原文地址:https://www.cnblogs.com/liubo175175/p/3678696.html
Copyright © 2011-2022 走看看