您的位置:首页 > Web前端 > HTML

IE版本信息的获取:从mshtml.dll获取到的和IE的“关于“获取的版本不一致

2017-08-16 14:51 323 查看
项目中获取的IE的版本号信息,我使用了如下的方法:

//获取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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: