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.
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
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
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(da URL);
} 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('Shoc kwaveFlash .Shockwave Flash.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('SWCt l.SWCtl.1' );
}
// check for redirection
return redirectCheck(pluginFound, redirectURL, redirectIfFound);
}
function detectQuickTime(redirectUR L, redirectIfFound) {
pluginFound = detectPlugin('QuickTime');
// if not found, try to detect with VisualBasic
if(!pluginFound && detectableWithVB) {
pluginFound = detectQuickTimeActiveXCont rol();
}
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('rmo cx.RealPla yer G2 Control') ||
detectActiveXControl('Real Player.Rea lPlayer(tm ) ActiveX Control (32-bit)') ||
detectActiveXControl('Real Video.Real Video(tm) ActiveX Control (32-bit)'));
}
return redirectCheck(pluginFound, redirectURL, redirectIfFound);
}
function detectWindowsMedia(redirec tURL, redirectIfFound) {
pluginFound = detectPlugin('Windows Media');
// if not found, try to detect with VisualBasic
if(!pluginFound && detectableWithVB) {
pluginFound = detectActiveXControl('Medi aPlayer.Me diaPlayer. 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[plugins ArrayCount er].name.i ndexOf(daP lugins[nam esCounter] ) >= 0) ||
(navigator.plugins[plugins ArrayCount er].descri ption.inde xOf(daPlug ins[namesC ounter]) >= 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.inde xOf('MSIE' ) != -1) && (navigator.userAgent.index Of('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('detectab leWithVB = 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(activ eXControlN ame)');
document.writeln(' on error resume next');
document.writeln(' detectActiveXControl = False');
document.writeln(' If detectableWithVB Then');
document.writeln(' detectActiveXControl = IsObject(CreateObject(acti veXControl Name))');
document.writeln(' End If');
document.writeln('End Function');
document.writeln('\'and the following function handles QuickTime');
document.writeln('Function detectQuickTimeActiveXCont rol()');
document.writeln(' on error resume next');
document.writeln(' detectQuickTimeActiveXCont rol = False');
document.writeln(' If detectableWithVB Then');
document.writeln(' detectQuickTimeActiveXCont rol = False');
document.writeln(' hasQuickTimeChecker = false');
document.writeln(' Set hasQuickTimeChecker = CreateObject("QuickTimeChe ckObject.Q uickTimeCh eck.1")');
document.writeln(' If IsObject(hasQuickTimeCheck er) Then');
document.writeln(' If hasQuickTimeChecker.IsQuic kTimeAvail able(0) Then ');
document.writeln(' detectQuickTimeActiveXCont rol = 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>Support s 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>
<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(da
} else {
window.location = daURL;
}
return;
}
function redirectCheck(pluginFound,
// 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','
// if not found, try to detect with VisualBasic
if(!pluginFound && detectableWithVB) {
pluginFound = detectActiveXControl('Shoc
}
// check for redirection
return redirectCheck(pluginFound,
}
function detectDirector(redirectURL
pluginFound = detectPlugin('Shockwave','
// if not found, try to detect with VisualBasic
if(!pluginFound && detectableWithVB) {
pluginFound = detectActiveXControl('SWCt
}
// check for redirection
return redirectCheck(pluginFound,
}
function detectQuickTime(redirectUR
pluginFound = detectPlugin('QuickTime');
// if not found, try to detect with VisualBasic
if(!pluginFound && detectableWithVB) {
pluginFound = detectQuickTimeActiveXCont
}
return redirectCheck(pluginFound,
}
function detectReal(redirectURL, redirectIfFound) {
pluginFound = detectPlugin('RealPlayer')
// if not found, try to detect with VisualBasic
if(!pluginFound && detectableWithVB) {
pluginFound = (detectActiveXControl('rmo
detectActiveXControl('Real
detectActiveXControl('Real
}
return redirectCheck(pluginFound,
}
function detectWindowsMedia(redirec
pluginFound = detectPlugin('Windows Media');
// if not found, try to detect with VisualBasic
if(!pluginFound && detectableWithVB) {
pluginFound = detectActiveXControl('Medi
}
return redirectCheck(pluginFound,
}
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[plugins
(navigator.plugins[plugins
// 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.inde
document.writeln('<script language="VBscript">');
document.writeln('\'do a one-time test for a version of VBScript that can handle this code');
document.writeln('detectab
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
document.writeln(' on error resume next');
document.writeln(' detectActiveXControl = False');
document.writeln(' If detectableWithVB Then');
document.writeln(' detectActiveXControl = IsObject(CreateObject(acti
document.writeln(' End If');
document.writeln('End Function');
document.writeln('\'and the following function handles QuickTime');
document.writeln('Function
document.writeln(' on error resume next');
document.writeln(' detectQuickTimeActiveXCont
document.writeln(' If detectableWithVB Then');
document.writeln(' detectQuickTimeActiveXCont
document.writeln(' hasQuickTimeChecker = false');
document.writeln(' Set hasQuickTimeChecker = CreateObject("QuickTimeChe
document.writeln(' If IsObject(hasQuickTimeCheck
document.writeln(' If hasQuickTimeChecker.IsQuic
document.writeln(' detectQuickTimeActiveXCont
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
if(canDetectPlugins()) {
document.write('<b>Support
'<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
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
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
-Scott