zoukankan      html  css  js  c++  java
  • C# 开发Activex

    由于要在网页上显示Tree的结构,开始使用JQuery的Tree,但是当资料量很大时会导致第一次加载很慢。(特别慢,资料量太大了网页一下还反映不过来),于是改用JQuery的FileTree的插件,每层通过ajax的方式到后台获取资料,结果还好,不过当资料量大的时候,频繁的点击页面,反映也会很慢,而且要求Client的配置好些,而这边的site上帝配置都比较低,有的机器会导致无反映的情况。无奈改用Activex的方式吧。对vc不是特别的熟悉,于是选择了C#,因为site上的每个Client都会有.net Framework。OK..开始改写。

    主要参考:http://www.codeproject.com/KB/cs/CreateActiveXDotNet.aspx

    1.创建类库工程

    2.添加一个UserControl,AxTree

    3.定义AxTree Class的属性

    [ProgId("MyTreeActiveX.AxTree")]
    [Guid("A5C532BA-45B2-44c7-ACAE-D526EF9D47B0")]
    [ComVisible(true)]
    [ClassInterface(ClassInterfaceType.AutoDual)]
    [ComSourceInterfaces(typeof(ControlEvents))]

    public partial class AxTree : UserControl, IObjectSafety

    说明:

    ComVisible:是否可以见

    ComSourceInterfaces:该Activex实现的事件的类

    IObjectSafety:继承与该接口,标记安全,否则在生产Activex后,和网页交互还需要对ie进行设定。

    [
          Serializable,
          ComVisible(true)
      ]
       public enum ObjectSafetyOptions
       {
           INTERFACESAFE_FOR_UNTRUSTED_CALLER = 0x00000001,
           INTERFACESAFE_FOR_UNTRUSTED_DATA = 0x00000002,
           INTERFACE_USES_DISPEX = 0x00000004,
           INTERFACE_USES_SECURITY_MANAGER = 0x00000008
       }

    [
          ComImport(),
          Guid("CB5BDC81-93C1-11CF-8F20-00805F2CD064"),
          InterfaceType(ComInterfaceType.InterfaceIsIUnknown)
      ]
      public interface IObjectSafety
      {
          [PreserveSig]
          long GetInterfaceSafetyOptions(ref Guid iid, out int pdwSupportedOptions, out int pdwEnabledOptions);

          [PreserveSig]
          long SetInterfaceSafetyOptions(ref Guid iid, int dwOptionSetMask, int dwEnabledOptions);
      };

    4.添加方法,属性

    [ComVisible(true)]
           public string Leve1ColorRGB{get..set…}

    方法和属性添加 [ComVisible(true)] 就好

    5.添加Event

    写一个Event的接口,ControlEvent

    [ComVisible(true)]
        [Guid("5F6E5E2D-8C6D-4524-AD44-E8B169D90371")]
        [InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
        public interface ControlEvents
        {
            
            [DispId(0x60020001)]
            void OnDial(string callno, string updeppkey);

        }

    在AxTree中定义对应的Event:

    public event ControlEventHandler OnDial;

    6.实现IObjectSafety接口

    #region [IObjectSafety implementation]
            public long GetInterfaceSafetyOptions(ref Guid iid, out int pdwSupportedOptions, out int pdwEnabledOptions)
            {
                pdwSupportedOptions = (int)m_options;
                pdwEnabledOptions = (int)m_options;
                return 0;
            }

            public long SetInterfaceSafetyOptions(ref Guid iid, int dwOptionSetMask, int dwEnabledOptions)
            {
                return 0;
            }
            #endregion

    7.注册和反注册 Atviex

    [ComRegisterFunction()]
           public static void RegisterClass(string key)
           {
               // Strip off HKEY_CLASSES_ROOT\ from the passed key as I don't need it
               StringBuilder sb = new StringBuilder(key);
               sb.Replace(@"HKEY_CLASSES_ROOT\", "");

               // Open the CLSID\{guid} key for write access
               RegistryKey k = Registry.ClassesRoot.OpenSubKey(sb.ToString(), true);

               // And create the 'Control' key - this allows it to show up in
               // the ActiveX control container
               RegistryKey ctrl = k.CreateSubKey("Control");
               ctrl.Close();

               // Next create the CodeBase entry - needed if not string named and GACced.
               RegistryKey inprocServer32 = k.OpenSubKey("InprocServer32", true);
               inprocServer32.SetValue("CodeBase", Assembly.GetExecutingAssembly().CodeBase);
               inprocServer32.Close();

               // Finally close the main key
               k.Close();

           }

           [ComUnregisterFunction()]
           public static void UnregisterClass(string key)
           {
               StringBuilder sb = new StringBuilder(key);
               sb.Replace(@"HKEY_CLASSES_ROOT\", "");

               // Open HKCR\CLSID\{guid} for write access
               RegistryKey k = Registry.ClassesRoot.OpenSubKey(sb.ToString(), true);

               // Delete the 'Control' key, but don't throw an exception if it does not exist
               k.DeleteSubKey("Control", false);

               // Next open up InprocServer32
               RegistryKey inprocServer32 = k.OpenSubKey("InprocServer32", true);

               // And delete the CodeBase key, again not throwing if missing
               k.DeleteSubKey("CodeBase", false);

               // Finally close the main key
               k.Close();
           }

    8.生成强命名文件。xxx.snk.编译生成…ActvieX的dll写好了。

    安装:

    在该解决方案中添加一个安装项目,选择项目输出->主输出,确认ActiveX的dll文件的属性Register:vsdrpCOM,在调整下其他的属性(文件名..)编译就好。

    cab的安装制作:

    下载cabsdk的工具,微软网站上有的下。

    下载后执行如下:

    C:\cabsdk\BIN\MyTreeActiveX>cabarc.exe n TreeActiveX.cab TreeActiveXSetup.msi My
    TreeActiveX.inf

    Microsoft (R) Cabinet Tool - Version 1.00.0601 (03/18/97)
    Copyright (c) Microsoft Corp 1996-1997. All rights reserved.

    Creating new cabinet 'TreeActiveX.cab' with compression 'MSZIP':
      -- adding TreeActiveXSetup.msi
      -- adding MyTreeActiveX.inf

    Completed successfully

    会生成一个TreeActiveX.cab的文件,网页上就可以使用了。

    对了。inf的定义:

    [version]
    signature="$CHICAGO$"
    AdvancedINF=2.0
    [Setup Hooks]
    hook1=hook1

    [hook1]
    run=msiexec.exe /i "%EXTRACT_DIR%\TreeActiveXSetup.msi" /qn

    网页的写法:

    <object id="ActivexObject" name="ActivexObject" width="100%" height="100%" classid="clsid:A5C532BA-45B2-44c7-ACAE-D526EF9D47B0"></object>

    <script language='javascript'   for='ActivexObject'   event='OnDial(tel,uppkey)'>  

    dosame…

    </script>

    通过以上步骤完成ActiveX的编写,cab的制作和网页的部分。部署好后,会正常使用。

    不过该ActiveX没有签名,所有需要设定一下ie,允许下载为签名的activex才可以正常下载和使用。

    如何对ActiveX进行签名我还不知道,等有时间使用Google大法好好再查查看。

    收…

  • 相关阅读:
    Android AHandle AMessage
    android java 与C 通过 JNI双向通信
    android 系统给应用的jar
    UE4 unreliable 同步问题
    UE4 difference between servertravel and openlevel(多人游戏的关卡切换)
    UE4 Run On owing Client解析(RPC测试)
    UE4 TSubclassOf VS Native Pointer
    UE4 内容示例网络同步Learn
    UE4 多人FPS VR游戏制作笔记
    UE4 分层材质 Layerd Materials
  • 原文地址:https://www.cnblogs.com/zhucl1006/p/1551779.html
Copyright © 2011-2022 走看看