首页 新闻 会员 周边 捐助

网页上如何判断本地是否安装某个应用程序(js实现)

0
悬赏园豆:5 [已解决问题] 解决于 2015-09-23 14:22

如果存在则启动,如果不存在则提示,启动都能实现,问题是判断

Mask1的主页 Mask1 | 初学一级 | 园豆:113
提问于:2015-08-04 15:27
< >
分享
最佳答案
0

你启动磁盘上的 .exe 是如何实现的?

收获园豆:3
Launcher | 高人七级 |园豆:45050 | 2015-08-04 17:24

URL Protocol调用本地程序,但无法判断本地是否存在现在问题

Mask1 | 园豆:113 (初学一级) | 2015-08-05 10:25

@Mask-male: 试试这个组件:Scripting.FileSystemObject

Launcher | 园豆:45050 (高人七级) | 2015-08-05 10:50

@Mask-male: 这不叫后台,这叫运行在浏览器中的 JS 代码,我看了下还是没有权限。因此你只能通过 ActiveX 控件来实现,如果你实现了 ActiveX 控件,你都不需要使用 URL Protocol 了。

Launcher | 园豆:45050 (高人七级) | 2015-08-05 13:02

@Launcher: 如果用Activex控件,IE上是可以的,那火狐谷歌呢?

Mask1 | 园豆:113 (初学一级) | 2015-08-05 13:51

@Mask-male: 可以写插件实现。

Launcher | 园豆:45050 (高人七级) | 2015-08-05 14:45

@Launcher: 插件好复杂赶脚,我看别人写的,http://www.cnblogs.com/shuang121/archive/2012/06/04/2534296.html,还是看不懂

Mask1 | 园豆:113 (初学一级) | 2015-08-05 14:53

@Mask-male: 你这个链接是 ActiveX 控件,不是火狐谷歌的“插件”。你看得这篇文章还没讲完,还没告诉你如何签名、打包和实现ISafeObject接口。一般都是用 C/C++ 写 ActiveX,用 C# 的话,你得考虑客户机是否安装了 .Net Framework。

Launcher | 园豆:45050 (高人七级) | 2015-08-05 15:14

@Launcher: 哦哦,采用C#方法有相关资料吗,地址什么的

Mask1 | 园豆:113 (初学一级) | 2015-08-05 15:20

@Launcher: 也不知道这个讲得对不对http://wenku.baidu.com/link?url=IctZOYkzKuo0Nc6TxO7zHZPEYjxCOhB7TooycXcD4AXTawSYjirc0JG1ulaTNPbaB08k7t8asYzg_eiIUZ09ckjBGaT5djgE89MvT17ua5O

Mask1 | 园豆:113 (初学一级) | 2015-08-05 15:45

@Mask-male: 这是本机代码的打包方式,其中关于证书的地方需要改进,你需要购买一个正式的证书用于签名。

Launcher | 园豆:45050 (高人七级) | 2015-08-05 15:49

@Launcher: 还有别的方式判断吗,迅雷的下载链接提示没有安装迅雷,应该没有用到证书吧?

Mask1 | 园豆:113 (初学一级) | 2015-08-05 16:00

@Mask-male: 看到你这个问题时,我的第一反应就是“怎么回事?居然还有别的我不知道的方式?迅雷这么厉害,他们是怎么搞的?难道是使用 Flash?不对,用户也可能没安装?...”,当然,我很快反应过来了,因为我写过 ActiveX,而你没写过,你甚至都不知道 ActiveX 是啥?虽然你不知道从哪儿抄了一段代码:

function   IsInstallQQ(){     
  try{//支持  
  var   xmlhttp=new   ActiveXObject("TimwpDll.TimwpCheck");  
      return   true;  
  }catch(e){//不支持  
}

但是很明显,你连这段 JS 代码都没认真去读。不管客户端安装没有安装 ActiveX 控件,你只需要 new ActiveXObject 就行了,创建成功,就表明安装了,创建失败,就是没安装。

Launcher | 园豆:45050 (高人七级) | 2015-08-05 16:40

@Launcher: 仔细一看确实,这种方法跟ActiveX区别在于,该方法只适合IE,手写的ActiveX可以在火狐谷歌上运行对吧?查了下ActiveXObkect是为自动化对象提供接口的,我们公司有做C++的,如果让他来写,我应该让具体了解什么,该如何下手,后面的程序该怎么与我开发程序相结合?

Mask1 | 园豆:113 (初学一级) | 2015-08-05 20:37

@Mask-male: 问题有点多不好意思啊,讨论了下,C++方面的只会底层,还是考虑C#做吧,步骤大致是什么样的呢?

Mask1 | 园豆:113 (初学一级) | 2015-08-06 09:16

@Mask-male: new   ActiveXObject("TimwpDll.TimwpCheck") -〉 这个就叫创建 ActiveX 对象。火狐谷歌是否支持或怎么支持 ActiveX  技术,你可以上网搜下。

让他了解 COM,可以使用 MFC 或 ATL 来创建 ActiveX 控件。他编写一个 ActiveX 控件,随着你的应用程序一起安装到客户端上,并注册到注册表,在 ActiveX 控件实例化中就干一件事,使用 ShellExecute 或 CreateProcess 启动你的 .exe 程序。

Launcher | 园豆:45050 (高人七级) | 2015-08-06 09:21

@Launcher: 我找到一篇跟你说的很像的http://www.cnblogs.com/xachary/p/3282824.html

Mask1 | 园豆:113 (初学一级) | 2015-08-06 09:25

@Mask-male: 你这是 .Net 的,不是本机代码实现。

Launcher | 园豆:45050 (高人七级) | 2015-08-06 09:27

@Launcher: 你以前写的插件还在不,我模仿下

Mask1 | 园豆:113 (初学一级) | 2015-08-06 11:50

@Launcher: 有C#实现的案例吗?

Mask1 | 园豆:113 (初学一级) | 2015-08-06 14:41

@Mask-male: http://www.cnblogs.com/xachary/p/3282824.html

Launcher | 园豆:45050 (高人七级) | 2015-08-06 14:42

@Launcher:  http://www.cnblogs.com/weixing/archive/2013/06/28/3161165.html

Mask1 | 园豆:113 (初学一级) | 2015-08-06 14:45

@Mask-male: 这篇讲的很全,可以参考,注意“二、部署已签名的ActiveX控件”中关于“受信任的根证书颁发机构”的描述,因为你不可能去每个客户的浏览器中去做这个事情,所以你最好申请一个正式的证书。

Launcher | 园豆:45050 (高人七级) | 2015-08-06 16:05

@Launcher: 

文章提出了这几点。第三点意思是说只能在IE上使用吗?

Mask1 | 园豆:113 (初学一级) | 2015-08-06 17:10

@Launcher: 下载地址都不行了,有现成的插件没

Mask1 | 园豆:113 (初学一级) | 2015-08-07 09:36

@Mask-male: 没有,我就是给你指个方向,除了这种兼容 ActiveX 控件的方式,你还可以为 FireFox 开发独立的插件来实现你的需求。后一种方法更好,虽然你需要编写多套代码。

Launcher | 园豆:45050 (高人七级) | 2015-08-07 09:43

@Launcher: 写到后面发现很多不相同的地方我的CAB只有makecat.exe,文中提示的是makecab.exe。CSharpActiveX.Setup.msi没错,我试了下将我的.msi文件拷贝到CAB目录下,双击makecat.exe文件进行打包,但是没有输出CSharpActiveX.CAB文件,

Mask1 | 园豆:113 (初学一级) | 2015-08-07 10:16

@Mask-male: 你去下载一个 cab sdk。

Launcher | 园豆:45050 (高人七级) | 2015-08-07 10:34

@Launcher: 这是之前下载的,我看都是这个这是下载后的好像不对,

Mask1 | 园豆:113 (初学一级) | 2015-08-07 11:21

@Mask-male: 在你的 C:\Windows\SysWOW64 和 C:\Windows 目录下搜索。

Launcher | 园豆:45050 (高人七级) | 2015-08-07 11:35

@Launcher: 我下载了一些例子,运用Activex都是出现个弹窗,感觉跟我要的不一样

Mask1 | 园豆:113 (初学一级) | 2015-08-07 15:15

@Mask-male: 这里有两种方式,在 HTML 中添加标签:

<OBJECT ID="ob1" WIDTH=850 HEIGHT=500
 CODEBASE="xxxx.cab#Version=1,0,0,1"
 CLASSID="CLSID:xxxxxx">
</OBJECT>

那么如果客户端没有安装过组件,会自动去服务器下载对应的 cab 包并安装,这个过程浏览器会弹窗,是肯定的,因为要在客户端安装程序,就算是微软自己开发的 ActiveX 控件也需要用户确认,这是出于安全考虑。

另一种方式,使用 ActiveXObject 对象直接创建,创建失败就跳转到应用程序下载页面提示用户下载安装,这个过程,浏览器不会管,因为下载文件的动作是用户自愿的行为。这一种方式就类似迅雷的模式。那么在这种方式下,就没有 ActiveX 控件那么麻烦,只需要 COM 组件即可,你也不用制作 CAB 包,也不用证书,签名什么的。如果你使用 .Net,你只需要让你的 .Net 程序集转换成 COM 可见即可。

Launcher | 园豆:45050 (高人七级) | 2015-08-07 15:32

@Launcher: 你后面说的方法com组件,实现步骤大致什么样的?

Mask1 | 园豆:113 (初学一级) | 2015-08-07 15:50
Launcher | 园豆:45050 (高人七级) | 2015-08-07 15:55

@Launcher: 看不懂啊,帮我直接远程吧

Mask1 | 园豆:113 (初学一级) | 2015-08-07 16:22

@Mask-male: 为什么要使用com组件,能不能先用在IE上实现判断?

Mask1 | 园豆:113 (初学一级) | 2015-08-07 16:43

@Launcher: 我将创建好的GUID放在了第一行,

第九步骤,写不了

Mask1 | 园豆:113 (初学一级) | 2015-08-08 09:53

@Launcher:第九步各种问题,环境也设置了,能不能帮帮我,公司规定的时间已经超过几天了,还没出结果。。。

Mask1 | 园豆:113 (初学一级) | 2015-08-10 10:38

@Launcher:

已经成功加入缓存了,

 

能翻译成js吗?

Mask1 | 园豆:113 (初学一级) | 2015-08-11 11:46

@Mask-male: 你都写了好几遍了,还问我能翻译成 JS 不,告诉你,我根本不会 JS。

function   IsInstallQQ(){     
  try{//支持  
  var   xmlhttp=new   ActiveXObject("MyLib.MyClass");  

   o.Initialize();

   alert "1 + 2 = " & o.Add(1,2));

o.Dispose();
       return   true;  
  }catch(e){//不支持  
}

Launcher | 园豆:45050 (高人七级) | 2015-08-11 11:50

@Launcher:框框内内的意思大致是?

 

Mask1 | 园豆:113 (初学一级) | 2015-08-11 13:45

@Mask-male: 调用 MyLib.MyClass 对象的 Initialize 方法,然后调用 add 方法,然后调用 dispose 方法。

Launcher | 园豆:45050 (高人七级) | 2015-08-11 14:01

@Launcher: IE上效果达到了,js能调用MyLib.dll,但是是我手动加入缓存的(第九步该如何简化),以后项目完成部署用户电脑上怎么自动执行,而不需要执行命令提示,火狐谷歌上不行,我试着安装了第一个步骤的扩展但是没有区别,

Mask1 | 园豆:113 (初学一级) | 2015-08-11 16:15

@Mask-male: 制作一个安装包,在安装过程中用代码实现第 9 步。火狐谷歌不行,你就单独为它们俩各开发一个插件。

Launcher | 园豆:45050 (高人七级) | 2015-08-11 16:23

@Launcher: 我查了下将dll加入全局缓存好像必须在命令提示下才行

Mask1 | 园豆:113 (初学一级) | 2015-08-12 09:07

@Mask-male: 你知道就你这个问题,能让你学到多少知识吗?你才给 5 分,怪不得没人愿意回答你。

System.Diagnostics.Process.Start("gacutil.exe","/i mylib.dll").

Launcher | 园豆:45050 (高人七级) | 2015-08-12 09:15

@Launcher: 分确实有点低,刚开始不知道这问题会牵扯这么多东西,下次加分

现在又遇到问题了,你所说的制作一个安装包使用VS2010自带的工具吗,

代码应该写在哪呢?不知道这对不对,重新再生成个安装包

Mask1 | 园豆:113 (初学一级) | 2015-08-12 10:01

@Mask-male: 你把 MSDN 上关于“安装与部署项目”的文档地址贴出来。

Launcher | 园豆:45050 (高人七级) | 2015-08-12 10:08

@Launcher:https://msdn.microsoft.com/zh-cn/library/vstudio/wx3b589t(v=vs.100).aspx

感觉没相关介绍啊?

Mask1 | 园豆:113 (初学一级) | 2015-08-12 11:36

@Mask-male: 这个页面有个表格,是对项目类型和目的的简单介绍,你看下,你应该选哪种项目类型?

Launcher | 园豆:45050 (高人七级) | 2015-08-12 11:52

@Launcher: 选安装项目,然后呢

Mask1 | 园豆:113 (初学一级) | 2015-08-12 15:55

@Mask-male: 然后看页面底部:

请参见


任务

 
随便点一个进去,看看安装部署项目是怎么做的。
 
 
Launcher | 园豆:45050 (高人七级) | 2015-08-12 16:02

@Launcher: 看了下,添加了程序集,应该是添加到全局程序集缓存中才是?这个添加后去哪了?

Mask1 | 园豆:113 (初学一级) | 2015-08-12 16:32

@Mask-male: 找到部署任务和演练页面。

Launcher | 园豆:45050 (高人七级) | 2015-08-12 17:08
其他回答(3)
0

天天瞎想啥呢?这能让你判断么?除非你像qq一样,有自己的浏览器插件。。。或者貌似可以实现自己的协议什么的吧,以前记得qq貌似有tencent://这样的地址。。。

收获园豆:1
顾晓北 | 园豆:10898 (专家六级) | 2015-08-04 16:19

是啊现在就打算自己做插件,但感觉难度挺大的,上面要求我做出来哎被逼的啊,如果不采用插件首先还是得在IE上简单实现下哪怕是需要手动设置什么的,

支持(0) 反对(0) Mask1 | 园豆:113 (初学一级) | 2015-08-05 10:28
0

js需要浏览器去判断,所以没有办法,你可以去后台,遍历EXE的文件,看看存在吗

收获园豆:1
稳稳的河 | 园豆:4216 (老鸟四级) | 2015-08-04 17:02

后台代码操作的是服务器上的数据,必须是js

支持(0) 反对(0) Mask1 | 园豆:113 (初学一级) | 2015-08-05 10:29

后台?哪个后台???你在开玩笑么?Web的所谓后台就是服务器,你去判断服务器有没有安装某个EXE?

支持(0) 反对(0) 顾晓北 | 园豆:10898 (专家六级) | 2015-08-05 11:19

别那么激动,不就是看错了没

支持(0) 反对(0) 稳稳的河 | 园豆:4216 (老鸟四级) | 2015-08-05 11:39

@稳稳的河: 也别介意,稍微激动了点,不过,楼主说是js,肯定是web,你却联系到“后台”,这个本身确实有问题。

支持(0) 反对(0) 顾晓北 | 园豆:10898 (专家六级) | 2015-08-05 11:54

@Mask-male: 我做个判断我需要的一个程序在不,不在给他下载的,你可以去试试,js的

支持(0) 反对(0) 稳稳的河 | 园豆:4216 (老鸟四级) | 2015-08-05 12:28

@顾晓北: 你可能没说清楚,网页启动客户端检测客户端,项目由网页部分及客户端程序部分组成,网页上有一个进入按钮,如果客户端安装了,点击按钮直接打开客户端程序,如果未安装则提示消息提醒安装客户端程序,类似QQ游戏大厅,阿里旺旺,

 在客户端安装时我们只需要写如下注册表信息:

[HKEY_CLASSES_ROOT\test]
@="testProtocol"
"URL Protocol"=""C:\\Program Files\\test.Setup\\test.exe""

[HKEY_CLASSES_ROOT\Ustcori\DefaultIcon]
@=""C:\\Program Files\\test.Setup\\test.exe,1""

[HKEY_CLASSES_ROOT\test\shell]

[HKEY_CLASSES_ROOT\test\shell\open]

[HKEY_CLASSES_ROOT\test\shell\open\command]
@=""C:\\Program Files\\test.Setup\\Driver.exe""

这样就注册了一个新协议test,之后直接通过在浏览器中输入test:\\\ ,就会自动从注册表中查找该协议程序的地址,打开客户端程序。

然后就要实现客户端未安装时,提示消息了。

 这个颇费周折,网上没有找到相关的方式,大多的实现方式也是通过js调用WScript.Shell控件。

后来找到了网上有很多QQ的实现方式:

制作一个自定义控件后,并对它进行安全授 权,连同客户端程序一起安装,该自定义控件会往注册表中写值,然后通过js实例化该控件,如果异常说明客户端程序未安装。

 function   IsInstallQQ(){     
  try{//支持  
  var   xmlhttp=new   ActiveXObject("TimwpDll.TimwpCheck");  
      return   true;  
  }catch(e){//不支持  
   
  location.href='http://is.qq.com/webpresence/up_alarm.shtml';  
 //window.open('http://is.qq.com/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_ROOT\TimwpDll.TimwpCheck]
@="TimwpDll.TimwpCheck"

[HKEY_CLASSES_ROOT\TimwpDll.TimwpCheck\CLSID]
@="ED4CA2E5-0EEA-44C1-AD7E-74A07A7507A4" 

用VS2010制作自定义activex控件

做到这里就不行了

 

支持(0) 反对(0) Mask1 | 园豆:113 (初学一级) | 2015-08-05 12:40

@稳稳的河: 嗯是你这个意思,但是classid哪来的?是客户端安装时写入的吗?

支持(0) 反对(0) Mask1 | 园豆:113 (初学一级) | 2015-08-05 12:43

@Mask-male: 我们的实现方式差不多,不过我这里是获取客户端打印的打印机,思路是一样的

支持(0) 反对(0) 稳稳的河 | 园豆:4216 (老鸟四级) | 2015-08-05 17:35

@稳稳的河: 嗯,这个例子我看过,但是不全,很多信息都不知道是如何打包写入注册表中的

支持(0) 反对(0) Mask1 | 园豆:113 (初学一级) | 2015-08-05 21:07

@Mask-male: 他对这个控件进行了总结,你参考下的,http://blog.csdn.net/chen_zw/article/details/9336375

支持(0) 反对(0) 稳稳的河 | 园豆:4216 (老鸟四级) | 2015-08-10 13:07
0

请问您这个问题解决了吗,如何解决的,能分享一下吗?我现在也要做这种,用js判断本地有没有某个应用程序

jiangcm | 园豆:202 (菜鸟二级) | 2019-04-19 06:47

请问这个问题你解决了吗?能分享一下吗?我现在项目中也要做这个 浏览器调用本地程序 但要判断是否安装

支持(0) 反对(0) 永远在床上发梦 | 园豆:200 (初学一级) | 2021-06-24 11:35
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册