需求是这样的: 有一个软件,想要在安装之后可以通过页面启动(这个问题已经通过自定义协议的方式解决了)。还需要像迅雷专用链接那样,自动检测是否有安装,如果没有安装此软件就自动下载,如果有安装就直接执行该程序。需要运行程序是Windows的标准应用程序。 问题是,我如何才能知道该软件是否安装?之前尝试过的思路:1、安装软件的时候安装一个BHO,用JS检测BHO是否存在来判定该软件是否安装。但是不知道怎样用JS初始化BHO,所以没取得效果。
2、安装软件的时候写注册表,希望用JS读取注册表,但是似乎JS读注册表会面临权限上的问题,弹出安全提示,造成不必要的麻烦。看了一下迅雷的检测代码,因为我对JS并不是很了解,读了半天没看出个所以然,请各位大侠帮忙。谢谢了!最好是能和迅雷实现的机制完全一样。
2、安装软件的时候写注册表,希望用JS读取注册表,但是似乎JS读注册表会面临权限上的问题,弹出安全提示,造成不必要的麻烦。看了一下迅雷的检测代码,因为我对JS并不是很了解,读了半天没看出个所以然,请各位大侠帮忙。谢谢了!最好是能和迅雷实现的机制完全一样。
var Thunder = {
isIE:(navigator.userAgent.indexOf('MSIE')>0),
isOpenNew:null,
infoType:0,
thunderType:0,
mustUseSelected:null,
pId:"",
judgeThunder:function(sid){
var webcop = [];
sid=sid?sid:this.pId; if(webcop[sid]==1){
return 3;
}
else
return false;
},
getInstance: function(th){
/*Get download style*/
if(this.isOpenNew==null)
try{this.isOpenNew=(thunder_isOpenNewWindow==10?true:false)}catch(e){} if(this.mustUseSelected==null)
try{this.mustUseSelected=mustBeSelectedThunder;}catch(e){this.mustUseSelected=false;}
/*Get download client type*/
if(this.judgeThunder()){
this.thunderType=this.judgeThunder()
this.mustUseSelected=true;
}else{
if(!this.thunderType)
{
try{
switch(selectThunderType)
{
case "coThunder5":
this.thunderType=4;
break;
case "coMiniThunder":
this.thunderType=5;
break;
case "coWebThunder":
default:
this.thunderType=3;
}
}catch(e){this.thunderType=3;this.mustUseSelected=false;}
}else{
}
} if(this.isIE){
/*var begi,endi;
if(this.thunderType==3||this.thunderType==4) begi=0; else begi=1;
if(this.mustUseSelected) endi=begi; else endi=2-begi;
var strEx="i++";strJudge="i<=endi";
if(endi<begi){strEx="i--";strJudge="i>=endi";}*/
//var opt = [Thunder.WebThunder,Thunder.Thunder5,Thunder.MiniThunder];
if(this.thunderType==4){
var opt = [Thunder.Thunder5,Thunder.WebThunder,Thunder.MiniThunder];
}else if(this.thunderType==3){
var opt = [Thunder.WebThunder,Thunder.Thunder5,Thunder.MiniThunder];
}else{
var opt = [Thunder.WebThunder,Thunder.Thunder5,Thunder.MiniThunder];
}
if(typeof selectThunderType =='undefined'){
var opt = [Thunder.WebThunder,Thunder.Thunder5,Thunder.MiniThunder];
}
if(mustBeSelectedThunder==true){
var opt = [Thunder.WebThunder];
}
for(var i=0;i<opt.length;i++)
{
var tmpObj=opt[i].getInstance();
if(tmpObj!=null)
return tmpObj;
else
continue;
}
}else{ var oAtmp=Thunder.ffThunder.getInstance();
if(oAtmp){
var clientType=oAtmp.getClientType(); //No client has been seted up
if(clientType==0) return null;
if(this.mustUseSelected){
if((this.thunderType==4 && clientType==2)||(this.thunderType==3 && clientType==1))
oAtmp=null
}else{
}
}
return oAtmp;
}
return null;
},
companySetup:function(sCompany,sPid){
try {
sPid=sPid?sPid:this.pId; vhref = "http://analytics.xunlei.com/PV?peerid=" + sPid + "&uri=" + sCompany + "&src=" + document.location.href + "&screensize=" +window.screen.width +"*" +window.screen.height;
image1 = new Image(1,1);
image1.src = vhref;
}catch(e){}
},
setParameter: function(cid, url, refer, stat){
cid=cid?cid:this.pId;
var inputs = ["thunder_cid", "thunder_down_url", "thunder_down_pageurl", "thunder_stat_pageurl"];
var input;
for (var i=0; i<inputs.length; i++){
if (isUndef(input = $(inputs[i]))){
input = document.createElement("input");
input.type = "hidden";
input.id = inputs[i];
document.body.appendChild(input);
}
input.value = arguments[i];
}
},
download: function( url, refer, name, stat,cid){
var client;
client=this.getInstance();
this.pId=this.pId?this.pId:(cid?cid:"");
cid=cid?cid:this.pId;
if(!client){
if(!this.isIE && (client==0)){}else{this.showSetUpInfo(cid);}
}else{
if (this.isIE)
{
client.download(cid, url, refer, name, stat);
}else{
switch(this.thunderType){
case 4:
client.download(cid, url, refer, name, stat,1);
break;
case 3: default:
client.download(cid, url, refer, name, stat,2);
}
}
}
return false;
},
openWindow:function(url,flag){
var s=flag?flag:false; if(!this.isOpenNew)
{
var Info;
if(this.mustUseSelected)
{
if(this.thunderType==3){
Info=thunderLanguage["WebThunderSetUpInfo"];
}else if(this.thunderType==4){
Info=thunderLanguage["Thunder5SetUpInfo"];
} else{
Info=thunderLanguage["MiniThunderSetUpInfo"];
}
}else{
Info=thunderLanguage["AllSetUpInfo"];
}
}
//Open a dialogbox which tell user to setup thunder client
if(Info) alert(Info); if(this.infoType == 10 && !s)
top.location.href =url;
else
top.location.href =url;
//window.open(url,"WEBTHUNDER_SET_UP");
},
showSetUpInfo:function(pid){
var url; pid=pid?pid:this.pId;
if(this.isOpenNew){
//Goto thunder download page
if(pid.substr(0,1)=="g")
url="http://my.xunlei.com/setup.htm?gid=g"+pid;
else
url="http://cop.my.xunlei.com/setup/index.html?pid="+ pid;
}else{
if(this.isIE)
{
if(this.mustUseSelected)
{
if(this.thunderType==3)
url=wtd_ChangFolder(pid);
else
url=wtd_ChangFolder(pid);
}else{
url=wtd_ChangFolder(pid);
}
}else{
if(this.mustUseSelected)
{
if(this.thunderType==3)
url=wtd_ChangFolder(pid);
else
url=wtd_ChangFolder(pid);
}else{
url=wtd_ChangFolder(pid);
}
}
}
this.openWindow(url);
}
}
Thunder.WebThunder.getInstance = function(){ if (isUndef(this._thunder))
{
//Web app initialized here
try{
this._thunder = new Thunder.WebThunder();
}catch(e){
this._thunder=null;
}
}
return this._thunder;
}
Thunder.WebThunder.prototype = {
initialize: function(){
try{
this.__thunder = this.getThunder();
}catch(e){
throw(e);
}
},
getThunder:function(){
try{
return new ActiveXObject("ThunderServer.webThunder.1");
}catch(e){
throw(e);
}
},
/*get server build version*/
getVersion: function(){
return parseInt(this.__thunder.GetVersion().split(".")[3]);
},
download: function(cid,url,refer,name,stat){
if ((url.indexOf("mms://") != -1) || (url.indexOf("rtsp://")!= -1))
{
return true;
}else{
this.__thunder.CallAddTask2(Decode(url),Decode(stat),Decode(refer),1, "", Decode(name),document.cookie);
//this.__thunder.CallAddTask(Decode(url),Decode(stat),Decode(refer),1, "", Decode(name));
return false;
} }
}Thunder.Thunder5 = Class.create();
Thunder.Thunder5.getInstance = function(){
if (isUndef(this._thunder))
{
try{
this._thunder = new Thunder.Thunder5();}
catch(e){
this._thunder = null;}
}
return this._thunder;
}
Thunder.Thunder5.prototype = {
initialize: function(){
try{
this.__thunder = new ActiveXObject("ThunderAgent.Agent.1");
}catch(e){throw(e);}
},
download: function(cid, url, refer, name, stat){
try{ name=name?name:"";
this.addTask('', url, refer, name, stat);
this.commitTasks();
}catch(e){
alert(e.message);
}
},
addTask: function(cid, url, refer, name, stat){
var _addTask = [
Delegate.create(this, function(){this.__thunder.AddTask4(url, "", "", name, refer, -1, 0, -1, document.cookie, cid, stat);}),
Delegate.create(this, function(){this.__thunder.AddTask3(url, "", "", name, refer, -1, 0, -1, document.cookie, cid);}),
Delegate.create(this, function(){this.__thunder.AddTask2(url, "", "", name, refer, -1, 0, -1, document.cookie);}),
Delegate.create(this, function(){this.__thunder.AddTask(url, "", "", name, refer, -1, 0, -1);})
];
for (var i=0; i<_addTask.length; i++){
try{
_addTask[i]();
return;
}catch(e){
}
}
throw thunderLanguage["MethodUnSupported"];
},
commitTasks: function(){
var _commitTasks = [
Delegate.create(this, function(){this.__thunder.CommitTasks2(1);}),
Delegate.create(this, function(){this.__thunder.CommitTasks();})
];
for (var i=0; i<_commitTasks.length; i++){
try{
_commitTasks[i]();
return;
}catch(e){
}
}
throw thunderLanguage["MethodUnSupported"];
}
}
function OnDownloadClick(sDownloadURL,sResName, sRefPage,sPid,isOpenNewWindow,sType,selectType){ sPid=sPid?sPid:"";if(sType=="07") sPid="g"+sPid;
sResName="";
Thunder.infoType=10;
Thunder.pId=sPid?sPid:"";
try{
if(selectThunderType=='coWebThunder'){
selectType=3
}else if(selectThunderType=='coThunder5'){
selectType=4
}else{
selectType=5
}
}catch(e){
if(selectType && !isNaN(selectType)) selectType=Number(selectType);
}
if(selectType==3 || selectType==4){Thunder.thunderType=selectType;
//if(selectType==3) Thunder.mustUseSelected=true;
}
if(typeof(isOpenNewWindow)!="boolean"){
if(isNaN(isOpenNewWindow)) isOpenNewWindow=undefined; else isOpenNewWindow=Number(isOpenNewWindow);
if(isOpenNewWindow!=2 && isOpenNewWindow!=10) isOpenNewWindow=undefined;
}
if((isOpenNewWindow==true ||isOpenNewWindow==10) && isOpenNewWindow!=undefined)
Thunder.isOpenNew=true;
else if((isOpenNewWindow==false ||isOpenNewWindow==2) && isOpenNewWindow!=undefined)
Thunder.isOpenNew=false; return Thunder.download(sDownloadURL,sRefPage,sResName,sResName);
}function OnDownloadClick_Simple(linkObj,isOpenNewWindow,selectType)
{
thunder_linkType=1;
var sDownload = linkObj.getAttribute("thunderHref");
//var sResName = linkObj.getAttribute("thunderResTitle");
var sResName ="";
var sRefPage = location.href;
var sPid = linkObj.getAttribute("thunderPid");
var sType = linkObj.getAttribute("thunderType");
var sCompany= linkObj.getAttribute("CompanyName"); if (sCompany)
Thunder.companySetup(sCompany,sPid); sPid=sPid?sPid:"";
if(sType=="07") sPid="g"+sPid; var selThunder,openNew;
try{
if(selectThunderType=='coWebThunder'){
selThunder=3
}else if(selectThunderType=='coThunder5'){
selThunder=4
}else{
selThunder=5
}
}catch(e){
if(isOpenNewWindow){
switch(isOpenNewWindow)
{
case 3: case 4: case 5:
selThunder=isOpenNewWindow;
}
} if(!selThunder){ if (!isNaN(selectType) && selectType){
selectType=Number(selectType); if(selectType==3 || selectType==4 || selectType==5)
selThunder=selectType;
}
}
} var oldTType,oldTOpen,oldMustUse; oldTType =Thunder.thunderType;
oldMustUse =Thunder.mustUseSelected;
if(selThunder)
{ Thunder.thunderType=selThunder;
//if(selThunder==3)
//Thunder.mustUseSelected=true;
}
oldTOpen=Thunder.isOpenNew;
Thunder.isOpenNew=((isOpenNewWindow==2)?false:((isOpenNewWindow==1)?true:Thunder.isOpenNew)); Thunder.pId=sPid?sPid:"";
Thunder.download(sDownload,sRefPage,sResName,sResName);
Thunder.thunderType =oldTType;
Thunder.isOpenNew =oldTOpen;
Thunder.mustUseSelected =oldMustUse; return false;
}
* 用来检测是否安装指定的插件
* pluginsName 插件的名称
* activexObjectName 控件名称,主要针对于IE
* author: Jet Mah
* website: http://www.javatang.com/archives/2006/09/13/442864.html
*/
function checkPlugins(pluginsName, activexObjectName) {
// 通常ActiveXObject的对象名称是两个插件名称的组合
if (activexObjectName == '') activexObjectName = pluginsName + "." + pluginsName; var np = navigator.plugins;
// 针对于FF等非IE
if (np && np.length) {
for (var i = 0; i < np.length; i++) {
if (np[i].name.indexOf(pluginsName) != -1) return true;
}
return false;
}
// 针对于IE
else if (window.ActiveXObject) {
try {
var axobj = eval("new ActiveXObject(activexObjectName);");
// 将对象转化为布尔类型
return axobj ? true : false;
} catch (e) {
return false;
}
} else {
// 以上情况都排除则返回false
return false;
}
}
//最后说明一点的是,如何来查找插件的名称?我是通过Editplus中Html工具栏里面的“插入Object”命令来获取的,
//比如插入Flash对象之后这个命令会产生一段HTML代码,其中Object中的id属性里面,将名称的空格和最后的Object去除就是对象的名称了。
//比如Flash的id为“Shockwave Flash Object”,那它的插件名称为“Shockwave”;Quicktime的插件名称为“Quicktime”等等。
function Check()
{
try
{
var obj = new ActiveXObject("IMBHO.IMClient.1");
if( obj )
{
alert("已安装");
}
else
{
alert("被禁用")
}
}
catch (e)
{
alert( "未安装" );
}
}