今天闲来无聊研究了下 ActiveX插件开发,以前一直以为很牛逼,然后发现还是比较简单的东西..
首先: 在开始前 准备好 VS12开发工具,cabarc.exe 工具(注:这是 用来 将文件打包成cab的工具,cab包ie浏览器才会安装它,提供下载见文章最后)
开始:
1.新建一个Windows窗体控件库
2.新建用户控件
3.添加一个接口名为:IObjectSafety(此名固定用法)
添加的代码:(代码请勿改动)
1 using System; 2 using System.Runtime.InteropServices; 3 4 namespace MyFirstActiveX 5 { 6 [ComImport, GuidAttribute("CB5BDC81-93C1-11CF-8F20-00805F2CD064")] 7 [InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIUnknown)] 8 public interface IObjectSafety 9 { 10 [PreserveSig] 11 int GetInterfaceSafetyOptions(ref Guid riid, [MarshalAs(UnmanagedType.U4)] ref int pdwSupportedOptions, [MarshalAs(UnmanagedType.U4)] ref int pdwEnabledOptions); 12 13 [PreserveSig()] 14 int SetInterfaceSafetyOptions(ref Guid riid, [MarshalAs(UnmanagedType.U4)] int dwOptionSetMask, [MarshalAs(UnmanagedType.U4)] int dwEnabledOptions); 15 } 16 }
4.是用户控件(这里是UserControl1) 实现这个接口
5.用户控件添加特性 Guid guid为自己手动生成...(在vs工具->创建GUID)
6.给用户控件添加代码 ps:实现IObjectSafety的代码(此段代码固定)
1 #region IObjectSafety 成员 2 3 private const string _IID_IDispatch = "{00020400-0000-0000-C000-000000000046}"; 4 private const string _IID_IDispatchEx = "{a6ef9860-c720-11d0-9337-00a0c90dcaa9}"; 5 private const string _IID_IPersistStorage = "{0000010A-0000-0000-C000-000000000046}"; 6 private const string _IID_IPersistStream = "{00000109-0000-0000-C000-000000000046}"; 7 private const string _IID_IPersistPropertyBag = "{37D84F60-42CB-11CE-8135-00AA004BB851}"; 8 9 private const int INTERFACESAFE_FOR_UNTRUSTED_CALLER = 0x00000001; 10 private const int INTERFACESAFE_FOR_UNTRUSTED_DATA = 0x00000002; 11 private const int S_OK = 0; 12 private const int E_FAIL = unchecked((int)0x80004005); 13 private const int E_NOINTERFACE = unchecked((int)0x80004002); 14 15 private bool _fSafeForScripting = true; 16 private bool _fSafeForInitializing = true; 17 18 public int GetInterfaceSafetyOptions(ref Guid riid, ref int pdwSupportedOptions, ref int pdwEnabledOptions) 19 { 20 int Rslt = E_FAIL; 21 22 string strGUID = riid.ToString("B"); 23 pdwSupportedOptions = INTERFACESAFE_FOR_UNTRUSTED_CALLER | INTERFACESAFE_FOR_UNTRUSTED_DATA; 24 switch (strGUID) 25 { 26 case _IID_IDispatch: 27 case _IID_IDispatchEx: 28 Rslt = S_OK; 29 pdwEnabledOptions = 0; 30 if (_fSafeForScripting == true) 31 pdwEnabledOptions = INTERFACESAFE_FOR_UNTRUSTED_CALLER; 32 break; 33 case _IID_IPersistStorage: 34 case _IID_IPersistStream: 35 case _IID_IPersistPropertyBag: 36 Rslt = S_OK; 37 pdwEnabledOptions = 0; 38 if (_fSafeForInitializing == true) 39 pdwEnabledOptions = INTERFACESAFE_FOR_UNTRUSTED_DATA; 40 break; 41 default: 42 Rslt = E_NOINTERFACE; 43 break; 44 } 45 46 return Rslt; 47 } 48 49 public int SetInterfaceSafetyOptions(ref Guid riid, int dwOptionSetMask, int dwEnabledOptions) 50 { 51 int Rslt = E_FAIL; 52 string strGUID = riid.ToString("B"); 53 switch (strGUID) 54 { 55 case _IID_IDispatch: 56 case _IID_IDispatchEx: 57 if (((dwEnabledOptions & dwOptionSetMask) == INTERFACESAFE_FOR_UNTRUSTED_CALLER) && (_fSafeForScripting == true)) 58 Rslt = S_OK; 59 break; 60 case _IID_IPersistStorage: 61 case _IID_IPersistStream: 62 case _IID_IPersistPropertyBag: 63 if (((dwEnabledOptions & dwOptionSetMask) == INTERFACESAFE_FOR_UNTRUSTED_DATA) && (_fSafeForInitializing == true)) 64 Rslt = S_OK; 65 break; 66 default: 67 Rslt = E_NOINTERFACE; 68 break; 69 } 70 71 return Rslt; 72 } 73 74 #endregion
7.修改生成 属性,项目->右键->属性 请看下图演示.修改一下2处
8.ok 以上都是 模板话的工作..... 现在开始 是代码工作..... 在 用户空间中拖一个button
然后双击 写一个处理方法为: MessageBox.Show(DateTime.Now.ToString("F"));
9.ok,生成一下,找到 bin目录下的 dll文件(后面马上用到) ,就此 控件代码任务 完成.下面开始 测试部分
10.新建一个asp.net网站(MVC什么都行), 将刚刚的dll 扔到网站根目录下 或者文件夹下 我这使用了一个名为DLL的文件夹
在 页面上添加 代码:
1 <object id="mytt" classid="clsid:195FE621-2DCA-43DC-BF54-A13E16EFC58E" 2 codebase="/DLL/MyFirstActiveX.dll"></object>
注:这里的guid是我控件里自己生成的guid不是 IObjectSafety 接口中的guid
11.调试 项目:点击 测试按钮 得到结果如图:
12.上面是 按钮触发 效果...这里 也可以 使用js 调用 c#代码:
如下代码:
1 <script type="text/javascript"> 2 $(function() { 3 var s = $('#mytt')[0]; 4 s.test(); 5 }); 6 </script>
我是用了jquery需要的自引用
最后感谢 蜗牛 的大力支持
ok,就说到这 好困 我去睡觉去了...大家晚安 2013年9月29日23:55:22
最后附上代码下载: 网站源码 自己搞吧..不上传了,直传插件部分源码下载