Link to home
Start Free TrialLog in
Avatar of robertleatherwood
robertleatherwood

asked on

Detect ActiveX Control without attempting to invoke it.

I would like to have a Javascript snippet of code that would first test for the existence of an .OCX/ActiveX control, and see if it is already installed on the system or not WITHOUT involking it. I want to be able to redirect the user to a custom page explaining the ActiveX without showing the information bar on IE. This is for Windows systems running MSIE only.

Even a javascript listing all the add-ons would be great. I could read it into an array and test for its existence.
ASKER CERTIFIED SOLUTION
Avatar of Scott Bennett
Scott Bennett
Flag of United States of America image

Link to home
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Start Free Trial
Wouldn't new ActiveXObject("") help you?
Using the navigator.plugins javascript object as I mentioned would give you the ability to detect which plugins are available on the browser without invoking them. The second link I provided goes to a page that does exactly that. The source code is below and you can use that as a basis for detecting any plugin you want.

<html>
<head>

<script language="JavaScript">
<!--
// initialize a variable to test for JavaScript 1.1.
// which is necessary for the window.location.replace method
var javascriptVersion1_1 = false;
// -->
</script>


<script language="JavaScript1.1">
<!--
javascriptVersion1_1 = true;
// -->
</script>


<script language="JavaScript">
<!--

// initialize global variables
var detectableWithVB = false;
var pluginFound = false;


function goURL(daURL) {
    // if the browser can do it, use replace to preserve back button
    if(javascriptVersion1_1) {
      window.location.replace(daURL);
    } else {
      window.location = daURL;
    }
    return;
}

function redirectCheck(pluginFound, redirectURL, redirectIfFound) {
    // check for redirection
    if( redirectURL && ((pluginFound && redirectIfFound) ||
      (!pluginFound && !redirectIfFound)) ) {
      // go away
      goURL(redirectURL);
      return pluginFound;
    } else {
      // stay here and return result of plugin detection
      return pluginFound;
    }      
}

function canDetectPlugins() {
    if( detectableWithVB || (navigator.plugins && navigator.plugins.length > 0) ) {
      return true;
    } else {
      return false;
    }
}

function detectFlash(redirectURL, redirectIfFound) {
    pluginFound = detectPlugin('Shockwave','Flash');
    // if not found, try to detect with VisualBasic
    if(!pluginFound && detectableWithVB) {
      pluginFound = detectActiveXControl('ShockwaveFlash.ShockwaveFlash.1');
    }
    // check for redirection
    return redirectCheck(pluginFound, redirectURL, redirectIfFound);
}

function detectDirector(redirectURL, redirectIfFound) {
    pluginFound = detectPlugin('Shockwave','Director');
    // if not found, try to detect with VisualBasic
    if(!pluginFound && detectableWithVB) {
      pluginFound = detectActiveXControl('SWCtl.SWCtl.1');
    }
    // check for redirection
    return redirectCheck(pluginFound, redirectURL, redirectIfFound);
}

function detectQuickTime(redirectURL, redirectIfFound) {
    pluginFound = detectPlugin('QuickTime');
    // if not found, try to detect with VisualBasic
    if(!pluginFound && detectableWithVB) {
      pluginFound = detectQuickTimeActiveXControl();
    }
    return redirectCheck(pluginFound, redirectURL, redirectIfFound);
}

function detectReal(redirectURL, redirectIfFound) {
    pluginFound = detectPlugin('RealPlayer');
    // if not found, try to detect with VisualBasic
    if(!pluginFound && detectableWithVB) {
      pluginFound = (detectActiveXControl('rmocx.RealPlayer G2 Control') ||
                   detectActiveXControl('RealPlayer.RealPlayer(tm) ActiveX Control (32-bit)') ||
                   detectActiveXControl('RealVideo.RealVideo(tm) ActiveX Control (32-bit)'));
    }      
    return redirectCheck(pluginFound, redirectURL, redirectIfFound);
}

function detectWindowsMedia(redirectURL, redirectIfFound) {
    pluginFound = detectPlugin('Windows Media');
    // if not found, try to detect with VisualBasic
    if(!pluginFound && detectableWithVB) {
      pluginFound = detectActiveXControl('MediaPlayer.MediaPlayer.1');
    }
    return redirectCheck(pluginFound, redirectURL, redirectIfFound);
}

function detectPlugin() {
    // allow for multiple checks in a single pass
    var daPlugins = detectPlugin.arguments;
    // consider pluginFound to be false until proven true
    var pluginFound = false;
    // if plugins array is there and not fake
    if (navigator.plugins && navigator.plugins.length > 0) {
      var pluginsArrayLength = navigator.plugins.length;
      // for each plugin...
      for (pluginsArrayCounter=0; pluginsArrayCounter < pluginsArrayLength; pluginsArrayCounter++ ) {
          // loop through all desired names and check each against the current plugin name
          var numFound = 0;
          for(namesCounter=0; namesCounter < daPlugins.length; namesCounter++) {
            // if desired plugin name is found in either plugin name or description
            if( (navigator.plugins[pluginsArrayCounter].name.indexOf(daPlugins[namesCounter]) >= 0) ||
                (navigator.plugins[pluginsArrayCounter].description.indexOf(daPlugins[namesCounter]) >= 0) ) {
                // this name was found
                numFound++;
            }  
          }
          // now that we have checked all the required names against this one plugin,
          // if the number we found matches the total number provided then we were successful
          if(numFound == daPlugins.length) {
            pluginFound = true;
            // if we've found the plugin, we can stop looking through at the rest of the plugins
            break;
          }
      }
    }
    return pluginFound;
} // detectPlugin


// Here we write out the VBScript block for MSIE Windows
if ((navigator.userAgent.indexOf('MSIE') != -1) && (navigator.userAgent.indexOf('Win') != -1)) {
    document.writeln('<script language="VBscript">');

    document.writeln('\'do a one-time test for a version of VBScript that can handle this code');
    document.writeln('detectableWithVB = False');
    document.writeln('If ScriptEngineMajorVersion >= 2 then');
    document.writeln('  detectableWithVB = True');
    document.writeln('End If');

    document.writeln('\'this next function will detect most plugins');
    document.writeln('Function detectActiveXControl(activeXControlName)');
    document.writeln('  on error resume next');
    document.writeln('  detectActiveXControl = False');
    document.writeln('  If detectableWithVB Then');
    document.writeln('     detectActiveXControl = IsObject(CreateObject(activeXControlName))');
    document.writeln('  End If');
    document.writeln('End Function');

    document.writeln('\'and the following function handles QuickTime');
    document.writeln('Function detectQuickTimeActiveXControl()');
    document.writeln('  on error resume next');
    document.writeln('  detectQuickTimeActiveXControl = False');
    document.writeln('  If detectableWithVB Then');
    document.writeln('    detectQuickTimeActiveXControl = False');
    document.writeln('    hasQuickTimeChecker = false');
    document.writeln('    Set hasQuickTimeChecker = CreateObject("QuickTimeCheckObject.QuickTimeCheck.1")');
    document.writeln('    If IsObject(hasQuickTimeChecker) Then');
    document.writeln('      If hasQuickTimeChecker.IsQuickTimeAvailable(0) Then ');
    document.writeln('        detectQuickTimeActiveXControl = True');
    document.writeln('      End If');
    document.writeln('    End If');
    document.writeln('  End If');
    document.writeln('End Function');

    document.writeln('</scr' + 'ipt>');
}
// -->
</script>


</head>

<body>

<script language="JavaScript">

document.write('<br><b>Can Detect Plugins:</b> ' + canDetectPlugins() + '<br><br>');

if(canDetectPlugins()) {
    document.write('<b>Supports Shockwave for Director:</b> ' + detectDirector() + '<br>' +
               '<b>Supports Shockwave Flash:</b> ' + detectFlash() + '<br>' +
               '<b>Supports QuickTime:</b> ' + detectQuickTime() + '<br>' +
               '<b>Supports RealPlayer:</b> ' + detectReal() + '<br>' +
               '<b>Supports Windows Media Player:</b> ' + detectWindowsMedia());
}
</script>

<noscript>
Your browser doesn't support JavaScript, so we can't check for plugins.
</noscript>


</body>
</html>

SBennett,

Thanks for your comment and participation here.  I saw your comment and it was the reason I wanted this question kept (PAQ).  However the question is asking about detecting an ActiveX object.  The plugin script you suggested, even with major modification, won't really do that.  ActiveX objects and plugins aren't the same thing.  Your comment is definitely interesting and worth keeping but, as I read the question, won't work for a solution.

I do hope Robertleatherwood will post to respond to the comments and clarify this.  Let me know if you have a question about this or still object to my recommendation.

b0lsc0tt
EE Cleanup Volunteer
If you look at the last portions of the javascript it uses javascript to write a vbscript in internet explorer browsers that will detect the presence of activex controls. you can modify this so that the vbscript will detect whatever activex controls you are looking for.
SBennett,

Thanks for the comment.  I did look closer and you are correct.  The script would need to be modified for the Asker to do exactly what he wants but I will change my recommendation.

    Changed recommendation - Accept: SBennett {http:#19552315}

Let me know if there are any objections or question.  A moderator will close this soon.

b0lsc0tt
EE Cleanup Volunteer
The script would indeed need to be modifed, If I had been given the name of the specific activex control, then I could incorporate that in another example. Howeber, the asker has not specified a particular activex control to check for, but is requesting a generic answer to the scenario. Thanks for taking a second look.

-Scott