




已阅读5页,还剩2页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
忙了一天,终于搞定啦,哈哈哈,网上这样的资料太少啦,常常在csdn看到有类似问题的解决了也不说解决办法的,最讨厌了,拉出来供大家学习,哈哈,博客也记录了/liyun919/archive/2009/11/13/4807958.aspx。1、 需求描述:项目由网页部分及客户端大厅程序部分组成,网页上有一个进入大厅按钮,如果客户端安装了,点击按钮直接打开客户端程序,如果未安装则提示消息提醒安装客户端程序。类似于QQ游戏大厅、联众游戏大厅的打开,QQ的强制聊天功能。 2、首先要实现如果客户端安装了,就打开客户端,网上大多给出的是通过js调用activex控件的方式实现,因为这样IE会弹出安全提示,感觉不好。function Run() var o = new ActiveXObject(WScript.Shell); o.exec(D:Program FilesUlead SystemsUlead VideoStudio 9.0vstudio.exe); 其实我们只需要通过注册协议方式就可以成功实现。在客户端安装时我们只需要写如下注册表信息:HKEY_CLASSES_ROOTtest=testProtocolURL Protocol=C:Program Filestest.Setuptest.exeHKEY_CLASSES_ROOTUstcoriDefaultIcon=C:Program Filestest.Setuptest.exe,1HKEY_CLASSES_ROOTtestshellHKEY_CLASSES_ROOTtestshellopenHKEY_CLASSES_ROOTtestshellopencommand=C:Program Filestest.SetupDriver.exe 这样就注册了一个新协议test,之后直接通过在浏览器中输入test: ,就会自动从注册表中查找该协议程序的地址,打开客户端程序。 3、然后就要实现客户端未安装时,提示消息了。这个颇费周折,网上没有找到相关的方式,大多的实现方式也是通过js调用WScript.Shell控件。后来找到了网上有很多QQ的实现方式: function IsInstallQQ() try/支持 var xmlhttp=new ActiveXObject(TimwpDll.TimwpCheck); return true; catch(e)/不支持 location.href=/webpresence/up_alarm.shtml; /window.open(/webpresence/up_alarm.htm,toolbar=no,location=no,directories=no,status=no,menubar=no, scrollbars=yes,resizable=no,copyhistory=no,width=410, height=410,top=0,left=0) return false; return false; 对于红色那段activex的调用是怎么回事却没有说明,搜索一下发现msn,迅雷等其实是通过类似的方式实现的,制作一个自定义控件后,并对它进行安全授权,连同客户端程序一起安装,该自定义控件会往注册表中写值,然后通过js实例化该控件,如果异常说明客户端程序未安装。看一下QQ如何写值的:HKEY_CLASSES_ROOTTimwpDll.TimwpCheck=TimwpDll.TimwpCheckHKEY_CLASSES_ROOTTimwpDll.TimwpCheckCLSID=ED4CA2E5-0EEA-44C1-AD7E-74A07A7507A4 认准的实现方向,那么下面就展开对于自定义activex控件的调查。 4、利用VS2008制作自定义activex控件 a、首先在解决方案下建一个Windows控件库项目(windows from control library),然后增加一个控件UstcOriWebLab.cs。 b、打开AssemblyInfo.cs修改程序集信息。引用System.Security命名空间,并添加assembly : AllowPartiallyTrustedCallers()安全声明,修改assembly: ComVisible(false)为assembly: ComVisible(true)使程序集Com可见。 c、为Com Interop注册。右键demoActiveX项目属性,在“生成”选项卡里将“为Com Interop注册”打上勾即可。 d、选择菜单工具创建 Guid工具生成一个新的GuidE5FD041B-8250-4cbc-B662-A73FC7988FB5,copy下来,加在类头上Guid(F325140B-90E3-42d7-8F27-F1E68E1BD92E), ProgId(UstcOriWebLabActivex.UstcOriWebLab), ComVisible(true)F325140B-90E3-42d7-8F27-F1E68E1BD92E就是写入注册表的CLSID,UstcOriWebLabActivex.UstcOriWebLab为键名。 e、实现IObjectSafety接口,把ActiveX控件标记为安全的。ActiveX危险,那么为什么QQ以及MediaPlayer等都是用ActiveX的方式创建的,却没有问题?原来,这是因为这些ActiveX组件都声明自己是脚本安全的,而IE的中级安全设置上,是允许脚本安全的ActiveX创建,并且不予警告的。 IE怎么知道一个插件是脚本安全的?它是通过以下两个办法。一是查询ActiveX组件是否实现了IObjectSafety接口,并且返回脚本安全;二是查询ActiveX组件是否在注册表的Component Category Manager里表明自己实现了CATID_SafeForInitializing和CATID_SafeForScripting。(参考/optman/archive/2007/07/18/1698070.aspx) 那么我们就通过实现IObjectSafety接口建一个接口文件IObjectSafety.cs,内容如下:using System;using System.Collections.Generic;using System.Text;using System.Runtime.InteropServices;namespace UstcOriWebLabActivex ComImport, GuidAttribute(CB5BDC81-93C1-11CF-8F20-00805F2CD064) InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIUnknown) public 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); 在UstcOriWebLab.cs中实现接口using System;using System.Collections.Generic;using System.ComponentModel;using System.Drawing;using System.Data;using System.Linq;using System.Text;using System.Windows.Forms;using System.Runtime.InteropServices;namespace UstcOriWebLabActivex Guid(F325140B-90E3-42d7-8F27-F1E68E1BD92E), ProgId(UstcOriWebLabActivex.UstcOriWebLab), ComVisible(true) public partial class UstcOriWebLab : UserControl, IObjectSafety public UstcOriWebLab() InitializeComponent(); 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; c
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年大连市事业单位教师招聘考试体育学科专业知识试卷(春季篇)
- 难点解析-人教版八年级上册物理声现象《声音的特性声的利用》同步测评练习题(解析版)
- 2025年贵州省事业单位招聘考试教师招聘音乐学科专业知识试卷
- 2025年南京市事业单位招聘考试教师招聘信息技术学科专业知识试卷
- 2025年武汉市事业单位招聘考试教师招聘英语学科专业知识试卷
- 内部考试从业资格证及答案解析
- 2.5(1)三角函数的应用说课稿2024-2025学年鲁教版(五四制)九年级数学上册
- 合肥会计从业考试及答案解析
- 技能高考护理测试题库及答案解析
- Review 4说课稿-2023-2024学年小学英语world 5oxford phonics(自然拼读)
- 2025山东潍坊市安丘市华安实业发展集团有限公司招聘2人笔试参考题库附答案解析
- 格尔木瑞诚气体有限责任公司搬迁升级改造项目报告书
- GB 40881-2021煤矿低浓度瓦斯管道输送安全保障系统设计规范
- 11466现代企业人力资源管理概论第11章
- T∕IAC CAMRA 20.3-2022 事故汽车维修工时测定及应用规范 第3部分:拆装工时
- DB31T 680.8-2019 城市公共用水定额及其计算方法 第8部分:公共管理和社会组织(机关单位)
- 智能制造 增材制造技术课件
- 中国古代数学中的数学文化课件
- 锚的作用与锚泊解析课件
- FHLG20型高频高压发生器说明书
- 国家自然科学基金资助项目结题报告模板(可编辑版)
评论
0/150
提交评论