web打开本地程序,未安装则提示要求安装的实现攻略
来源:互联网 发布:求最大公约数算法 编辑:程序博客网 时间:2024/05/24 04:15
需求:根据需求,在打开商城的需要提供打开客户端功能,比如点击商城的购买,需要提示客户安装客户端程序,如果已经安装,则直接打开客户端,类似于QQ
目前有两种方式来实现该功能
1 通过JS 调用WScript.shell,检测注册表是否已经安装客户端,如果安装在通过Run打开,并且可以传递参数到客户端程序
打开客户端示例:
function openexe( ) { try { debugger; var wsh = new ActiveXObject("WScript.shell"); var s1 = '123|'; var s2 = '456|'; var c = "file:///C:/Program%20Files%20(x86)/test//StudyActSystem.exe ";//路径最后需要空格
wsh.Run(c + s1 + s2); //运行程序 } catch (e) { alert(e.message + "\n 可能原因如下:\n 1、请检测安装路径是否正确 \n 2、Internet选项->安全->自定义级别->对没有标记为安全的ActiveX控件进行初始化和脚本运行->启用 3、请确认是否已经安装客户端"); } }
1.1 该方法的缺点:需要降低IE安全性,对客户对IE的熟悉度有要求,而且只能在IE上实现,其他浏览器不支持
2 通过注册表协议,打开客户端
第一步:注册协议到客户端注册表中, 下面是注册内容
Windows Registry Editor Version 5.00[HKEY_CLASSES_ROOT\test]"URL Protocol"="C:\\Program Files (x86)\\test\\StudyActSystem.exe"@="testProtocol"[HKEY_CLASSES_ROOT\test\DefaultIcon]@="C:\\Program Files (x86)\\test\\StudyActSystem.exe,1"[HKEY_CLASSES_ROOT\test\shell][HKEY_CLASSES_ROOT\test\shell\open][HKEY_CLASSES_ROOT\test\shell\open\command]@="\"C:\\Program Files (x86)\\test\\StudyActSystem.exe\" \"%1\""
把这段内容保存成.reg格式的文件,然后双击注册到注册表;也可以通过打包成.reg 文件,在程序安装的时候注册到注册表
第二步:制作自定义Activex控件(该内容是网上收集的资料,仅做学习用)
利用VS2010作自定义activex控件
- 首先在解决方案下建一个Windows控件库项目(windows from control library),然后增加一个控件UstcOriWebLab.cs。
- 打开AssemblyInfo.cs修改程序集信息。引用System.Security命名空间,并添加[assembly : AllowPartiallyTrustedCallers()]安全声明,修改[assembly: ComVisible (false)]为[assembly: ComVisible(true)]使程序集Com可见。
- 如果此项目向 COM 公开,则下列 GUID 用于类型库的 ID
[ assembly: Guid("F325140B-90E3-42d7-8F27-F1E68E1BD92E")],主要在AssemblyInfo中的GUID应当跟UstcOriWebLabActivex的GUID一致,否则程序会出现问题,惨痛的教训,就这个细节,把哥给整了1天 - 为Com Interop注册。右键demoActiveX项目属性,在“生成”选项卡里将“为Com Interop注册”打上勾即可。
- 选择菜单工具->创建 Guid工具生成一个新的Guid{F325140B-90E3-42d7-8F27-F1E68E1BD92E},copy下来,加在类头上[Guid("F325140B-90E3-42d7-8F27-F1E68E1BD92E"), ProgId("UstcOriWebLabActivex.UstcOriWebLab"), ComVisible(true)],F325140B-90E3-42d7-8F27-F1E68E1BD92E就是写入注册表的CLSID,UstcOriWebLabActivex.UstcOriWebLab为键名。
- 实现IObjectSafety接口,把ActiveX控件标记为安全的。
ActiveX危险,那么为什么QQ以及MediaPlayer等都是用ActiveX的方式创建的,却没有问题?原来,这是因为这些ActiveX组件都声明自己是脚本安全的,而IE的中级安全设置上,是允许脚本安全的ActiveX创建,并且不予警告的。
IE怎么知道一个插件是脚本安全的?它是通过以下两个办法。一是查询ActiveX组件是否实现了IObjectSafety接口,并且返回脚本安全;二是查询ActiveX组件是否在注册表的Component Category Manager里表明自己实现了CATID_SafeForInitializing和CATID_SafeForScripting。(参考http://blog.csdn.net/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; case _IID_IPersistStorage: case _IID_IPersistStream: case _IID_IPersistPropertyBag: 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 openClient() { try { debugger; var wsh = new ActiveXObject("UstcOriWebLabActivex.UstcOriWebLab"); window.open("test://hello");//hello 传递的参数,test 可以通过正则表达式过滤,客户端能取到hello参数 } catch (e) { window.open("/Download.html"); } }总结一下思路:
通过写注册表自定义协议,然后通过协议地址打开客户端;
自定义activex控件,并对控件进行安全授权,然后将该控件和客户端程序一起安装,写入注册表;
最后通过js实例化自定义activex控件来检查控件是否安装,从而判断客户端程序是否安装。
- web打开本地程序,未安装则提示要求安装的实现攻略
- 打开本地程序,未安装则提示要求安装的实现攻略
- 打开本地程序,未安装则提示要求安装的实现攻略
- 打开本地程序,未安装则提示要求安装的实现攻略
- 打开本地程序,未安装则提示要求安装的实现攻略
- 打开本地程序,未安装则提示要求安装的实现攻略
- windows下打开软件提示 未找到提供程序 该程序可能未正确安装
- js判断本地是否安装app,未安装去下载,已安装打开本地的app
- android 点击快捷方式提示未安装程序的解决
- android 点击快捷方式提示未安装程序的解决
- android 点击快捷方式提示未安装程序的解决
- 您的手机上未安装应用程序 android 点击快捷方式提示未安装程序的解决
- 使用致远OA系统,打开Excel类型文件,提示office编辑程序未安装
- android安装本地应用,并提示打开还是完成安装
- Android 打开其他应用,如果未安装进行提示代码
- 程序提示安装失败,或者安装未成功处理
- 打开SQL企业管理器提示“SQLDMO还未注册,请重新运行SQL SERVER安装程序,或者与管理员联系”
- 打开SQL企业管理器提示“SQLDMO还未注册,请重新运行SQL SERVER安装程序,或者与管理员联系”
- 利用google快速搜索android源码
- thinkphp query方法 && excute方法 && 数组方法 && 表达式方法(in)
- OpenEIM 从天上飘落下来
- HBase分页查询性能测试ppt分享
- 在JS中判断浏览器的类型
- web打开本地程序,未安装则提示要求安装的实现攻略
- dsl领域特定语言
- FreeEIM 是班级的学习委员
- 链表初涉
- 如何保持动画结束时的效果?
- Qt学习之路(17): Qt标准对话框之QMessageBox
- 作为一名程序员,我一直为中国的软件产业感到苦恼。
- jquery加载页面的方法(页面加载完成就执行)
- UNIX网络编程——套接字选项(SO_RCVBUF和SO_SNDBUF)