需求是这样的:    有一个软件,想要在安装之后可以通过页面启动(这个问题已经通过自定义协议的方式解决了)。还需要像迅雷专用链接那样,自动检测是否有安装,如果没有安装此软件就自动下载,如果有安装就直接执行该程序。需要运行程序是Windows的标准应用程序。    问题是,我如何才能知道该软件是否安装?之前尝试过的思路:1、安装软件的时候安装一个BHO,用JS检测BHO是否存在来判定该软件是否安装。但是不知道怎样用JS初始化BHO,所以没取得效果。
2、安装软件的时候写注册表,希望用JS读取注册表,但是似乎JS读注册表会面临权限上的问题,弹出安全提示,造成不必要的麻烦。看了一下迅雷的检测代码,因为我对JS并不是很了解,读了半天没看出个所以然,请各位大侠帮忙。谢谢了!最好是能和迅雷实现的机制完全一样。

解决方案 »

  1.   

    Thunder类
    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);
    }
    }
      

  2.   

    web迅雷和客户端版迅雷的类Thunder.WebThunder = Class.create();
    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"];
    }
    }
      

  3.   

    疑似判断的代码
    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;
    }
      

  4.   

    其实很简单,你既然已经是一个软件了,那么你就给ie注册一个object,然后在js里面try 一下new这个object能不能成功,能成功就是装了,不成功就是没装或者浏览器禁用了
      

  5.   

    转的        /* 
            * 用来检测是否安装指定的插件 
            * 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”等等。
      

  6.   

    自已的一个BHO插件,用了一个简化版的.
    function Check()
    {
     
    try
    {
     var obj = new  ActiveXObject("IMBHO.IMClient.1");
      if( obj )
      {
         alert("已安装");
      }
     else
     {
      alert("被禁用")
     }
    }
     catch (e)
     {
        alert( "未安装" );
     }
     
     }