IE版本信息的获取:从mshtml.dll获取到的和IE的“关于“获取的版本不一致
2017-08-16 14:51
369 查看
项目中获取的IE的版本号信息,我使用了如下的方法:
这个dll的百度知道的解释中https://baike.baidu.com/item/mshtml.dll/10967788?fr=aladdin有一点内容说:
“说明:一般只要缺少这个核心部件的话.IE会出现无法使用的情况.是有关 IE html 网页解释的应用扩展数据链接库
mshtml.dll (6.0.2800.1400),它的版本和自己的IE版本是匹配的,“
也许这个是在较早的系统上会保持一致的。但是现在我发现有些系统上这个,它的版本和自己的IE版本是不一致的。
大部分的机子上都是一致的,但是有个别的xp系统和win10系统中的ie是不一致的。经过调查,发生这个不一致的xp系统的ie本身损坏,就进行了升级;而windows10的不一致是表现为ie显示的版本的号的10.0.9200.17457,而用这个方法获取到的是10.17457.0.9200(这里用我用的机子的ie的版本号举例)的样子;
后来就在注册表内找到ie的版本信息,调查了十多台xp、win7,win10,后发现都是一致,于是就采用注册表获取的方法:
//获取ie版本号 #include "Winver.h" #pragma comment(lib,"Version.lib") CString GetIeVersionFromFile() { const TCHAR szFilename[] = _T("mshtml.dll"); DWORD dwMajorVersion = 0, dwMinorVersion = 0; DWORD dwBuildNumber = 0, dwRevisionNumber = 0; DWORD dwHandle = 0; DWORD dwVerInfoSize = GetFileVersionInfoSize(szFilename, &dwHandle);//判断容纳文件版本信息需要一个多大的缓冲区 if (dwVerInfoSize) { LPVOID lpBuffer = LocalAlloc(LPTR, dwVerInfoSize);//从堆中分配指定大小的字节数 if (lpBuffer) { //从支持版本标记的一个模块里获取文件版本信息 if (GetFileVersionInfo(szFilename, dwHandle, dwVerInfoSize, lpBuffer)) { VS_FIXEDFILEINFO * lpFixedFileInfo = NULL; UINT nFixedFileInfoSize = 0; if (VerQueryValue(lpBuffer, TEXT("\\"), (LPVOID*)&lpFixedFileInfo, &nFixedFileInfoSize) && (nFixedFileInfoSize)) {//从版本资源中获取信息 dwMajorVersion = HIWORD(lpFixedFileInfo->dwFileVersionMS);//主版本号 dwMinorVersion = LOWORD(lpFixedFileInfo->dwFileVersionMS);//福版本号 dwBuildNumber = HIWORD(lpFixedFileInfo->dwFileVersionLS);//编译版本号 dwRevisionNumber = LOWORD(lpFixedFileInfo->dwFileVersionLS);//修订版本号 } } LocalFree(lpBuffer); } } else { return _T(""); } TCHAR buf[512] = { 0 }; wsprintf(buf, _T("%d.%d.%d.%d"), dwMajorVersion, dwMinorVersion, dwBuildNumber, dwRevisionNumber); OutputDebugString(buf); CString strIEVer = buf; return strIEVer; }
这个dll的百度知道的解释中https://baike.baidu.com/item/mshtml.dll/10967788?fr=aladdin有一点内容说:
“说明:一般只要缺少这个核心部件的话.IE会出现无法使用的情况.是有关 IE html 网页解释的应用扩展数据链接库
mshtml.dll (6.0.2800.1400),它的版本和自己的IE版本是匹配的,“
也许这个是在较早的系统上会保持一致的。但是现在我发现有些系统上这个,它的版本和自己的IE版本是不一致的。
大部分的机子上都是一致的,但是有个别的xp系统和win10系统中的ie是不一致的。经过调查,发生这个不一致的xp系统的ie本身损坏,就进行了升级;而windows10的不一致是表现为ie显示的版本的号的10.0.9200.17457,而用这个方法获取到的是10.17457.0.9200(这里用我用的机子的ie的版本号举例)的样子;
后来就在注册表内找到ie的版本信息,调查了十多台xp、win7,win10,后发现都是一致,于是就采用注册表获取的方法:
BOOL GetRegQueryValue(HKEY hKey, LPCTSTR lpSubKey,LPCTSTR lpValueName, LPTSTR szQueryValue) { HKEY hResult; LONG nResult; BOOL b64OS = OSVersion::Is64BitOs(); if( b64OS == TRUE ) { nResult = RegOpenKeyEx(hKey, lpSubKey, 0, KEY_READ|KEY_WOW64_64KEY, &hResult); } else { nResult = RegOpenKeyEx(hKey, lpSubKey, 0, KEY_READ|KEY_WOW64_32KEY, &hResult); } if(ERROR_SUCCESS != nResult) { return FALSE; } DWORD lValueSize = 256, dwType = REG_SZ; nResult = RegQueryValueEx(hResult, lpValueName, NULL, &dwType, (LPBYTE)szQueryValue, &lValueSize); if(ERROR_SUCCESS != nResult) { RegCloseKey(hResult); return FALSE; } RegCloseKey(hResult); return TRUE; } CString GetIeVersionFromReg() { CString strIeVersion; CString strRegPath = _T("SOFTWARE\\Microsoft\\Internet Explorer"); TCHAR szVersion[256] = {0}; if( GetRegQueryValue(HKEY_LOCAL_MACHINE, strRegPath, _T("svcVersion"), (LPTSTR)szVersion )) { strIeVersion = szVersion; } else if( GetRegQueryValue(HKEY_LOCAL_MACHINE, strRegPath, _T("Version"), (LPTSTR)szVersion )) { strIeVersion = szVersion; } else { strIeVersion = GetIeVersionFromFile(); } return strIeVersion; }
相关文章推荐
- IE版本信息的获取:从mshtml.dll获取到的和IE的“关于“获取的版本不一致
- 关于jQuery通过ID获取元素时在IE7与IE其他版本以及其他浏览器的区别
- 获取dll版本信息
- delphi 获取Exe或DLL的文件版本信息
- 获取EXE或者DLL的版本信息
- 关于跨进程使用回调函数的研究:以跨进程获取Richedit中RTF流为例(在Delphi 初始化每一个TWinControl 对象时,将会在窗体 的属性(PropData)中加入一些标志,DLL的HInstance的值与HOST 进程的HInstance并不一致)
- C++文件操作——获取可执行文件或DLL版本信息
- VC 通过mshtml.dll获取ie版本号
- 本地ie版本大于7.0,MsHtml中get_userAgent获取UA为MSIE7
- Android系统信息(内存、cpu、sd卡、电量、版本)获取
- 关于java 和 android 下获取指定时间是本年第几周不一致问题的解决方法
- java 获取当然JDK版本信息
- 关于Android中获取短信息会话(threads)表中的信息
- 获取浏览器版本信息
- ASP.NET获取客户端的操作系统、浏览器、.NET版本等信息(图)
- ASP.NET获取客户端的操作系统、浏览器、.NET版本等信息
- 关于tomcat7服务下面js无法获取JSESSIONID的cookie信息
- js 获取系统信息(仅IE有效)
- 关于CentOS中jdk配置版本不一致的问题
- [ios]获取app版本更新检测的不同语言信息