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

项目中获取的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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

零点零一

您的鼓励将是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值