博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C# 开发Activex
阅读量:7221 次
发布时间:2019-06-29

本文共 4700 字,大约阅读时间需要 15 分钟。

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

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大法好好再查查看。

主要参考:

转载于:https://www.cnblogs.com/memaxiaofeng/archive/2013/04/02/3275505.html

你可能感兴趣的文章
2017-5-16 python标准库
查看>>
浅谈游戏的声音处理-流播放文件 source
查看>>
旧版本转换成支持ARC版本
查看>>
创建与服务器的输入输出流
查看>>
string.hのmemmove的实现
查看>>
dicom网络通讯入门(1)
查看>>
日常训练.jpg
查看>>
iOS----KVC和KVO 详解
查看>>
2019寒假训练营第三次作业
查看>>
precision、recall、accuracy的概念
查看>>
PyTorch学习系列(九)——参数_初始化
查看>>
后缀树
查看>>
PowerDesigner执行SQL生成模型
查看>>
软件项目技术点(2)——Canvas之平移translate、旋转rotate、缩放scale
查看>>
软件项目技术点(25)——提升性能之检测绘制范围
查看>>
linux的基本操作1
查看>>
puppeteer 填充基础表单
查看>>
邻接表存储
查看>>
web 常用开发工具
查看>>
Silverlight LoaderException错误
查看>>