收藏 分销(赏)

搜索插件是否安装.doc

上传人:s4****5z 文档编号:8850700 上传时间:2025-03-04 格式:DOC 页数:7 大小:51.50KB
下载 相关 举报
搜索插件是否安装.doc_第1页
第1页 / 共7页
搜索插件是否安装.doc_第2页
第2页 / 共7页
搜索插件是否安装.doc_第3页
第3页 / 共7页
搜索插件是否安装.doc_第4页
第4页 / 共7页
搜索插件是否安装.doc_第5页
第5页 / 共7页
点击查看更多>>
资源描述

1、忙了一天,终于搞定啦,哈哈哈,网上这样的资料太少啦,常常在csdn看到有类似问题的解决了也不说解决办法的,最讨厌了,拉出来供大家学习,哈哈,博客也记录了1、 需求描述:项目由网页部分及客户端大厅程序部分组成,网页上有一个进入大厅按钮,如果客户端安装了,点击按钮直接打开客户端程序,如果未安装则提示消息提醒安装客户端程序。类似于QQ游戏大厅、联众游戏大厅的打开,QQ的强制聊天功能。 2、首先要实现如果客户端安装了,就打开客户端,网上大多给出的是通过js调用activex控件的方式实现,因为这样IE会弹出安全提示,感觉不好。function Run() var o = new ActiveXObje

2、ct(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_ROO

3、TtestshellHKEY_CLASSES_ROOTtestshellopenHKEY_CLASSES_ROOTtestshellopencommand=C:Program Filestest.SetupDriver.exe 这样就注册了一个新协议test,之后直接通过在浏览器中输入test: ,就会自动从注册表中查找该协议程序的地址,打开客户端程序。 3、然后就要实现客户端未安装时,提示消息了。这个颇费周折,网上没有找到相关的方式,大多的实现方式也是通过js调用WScript.Shell控件。后来找到了网上有很多QQ的实现方式: function IsInstallQQ() try/支持

4、var xmlhttp=new ActiveXObject(TimwpDll.TimwpCheck); return true; catch(e)/不支持 location.href= /window.open( scrollbars=yes,resizable=no,copyhistory=no,width=410, height=410,top=0,left=0) return false; return false; 对于红色那段activex的调用是怎么回事却没有说明,搜索一下发现msn,迅雷等其实是通过类似的方式实现的,制作一个自定义控件后,并对它进行安全授权,连同客户端程序一起安装

5、该自定义控件会往注册表中写值,然后通过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 libr

6、ary),然后增加一个控件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-

7、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

8、等都是用ActiveX的方式创建的,却没有问题?原来,这是因为这些ActiveX组件都声明自己是脚本安全的,而IE的中级安全设置上,是允许脚本安全的ActiveX创建,并且不予警告的。 IE怎么知道一个插件是脚本安全的?它是通过以下两个办法。一是查询ActiveX组件是否实现了IObjectSafety接口,并且返回脚本安全;二是查询ActiveX组件是否在注册表的Component Category Manager里表明自己实现了CATID_SafeForInitializing和CATID_SafeForScripting。(参考 那么我们就通过实现IObjectSafety接口建一个接口

9、文件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 IOb

10、jectSafety 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(U

11、nmanagedType.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 UstcOriWebLabAc

12、tivex 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; pri

13、vate 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-

14、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); p

15、rivate 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

16、 | 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_IPersistP

17、ropertyBag: 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 =

18、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_IPers

19、istPropertyBag: if (dwEnabledOptions & dwOptionSetMask) = INTERFACESAFE_FOR_UNTRUSTED_DATA) & (_fSafeForInitializing = true) Rslt = S_OK; break; default: Rslt = E_NOINTERFACE; break; return Rslt; f、开始制作安装包新建一个安装项目,在项目上点右键,【添加】-【项目输出】,添加刚才的项目,生成项目,这样我们的activex控件就会和客户端程序一起安装到用户的机器上了。会生成两个文件,一个exe文件和一个msi文件。安装后,就是自动写入注册表键UstcOriWebLabActivex.UstcOriWebLab。客户端通过js检查:function IsInstall() try/支持 var xmlhttp=new ActiveXObject(UstcOriWebLabActivex.UstcOriWebLab); window.navigate(Ustcori:/); /打开客户端 catch(e)/不支持 alert(您未安装大厅程序!); return false; return false;

展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传
相似文档                                   自信AI助手自信AI助手
搜索标签

当前位置:首页 > 包罗万象 > 大杂烩

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2025 宁波自信网络信息技术有限公司  版权所有

客服电话:4009-655-100  投诉/维权电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :gzh.png    weibo.png    LOFTER.png 

客服