81 lines
1.9 KiB
C++
81 lines
1.9 KiB
C++
|
#include "main.h"
|
||
|
#include "./ieversion.h"
|
||
|
|
||
|
#include <shlwapi.h>
|
||
|
#include <strsafe.h>
|
||
|
|
||
|
HRESULT MSIE_GetVersionString(LPWSTR pszBuffer, INT cchBufferMax)
|
||
|
{
|
||
|
if (NULL == pszBuffer) return E_INVALIDARG;
|
||
|
|
||
|
HKEY hKey = NULL;
|
||
|
LONG result = RegOpenKeyEx(HKEY_LOCAL_MACHINE, L"Software\\Microsoft\\Internet Explorer", 0,
|
||
|
STANDARD_RIGHTS_READ | KEY_QUERY_VALUE, &hKey);
|
||
|
|
||
|
if (ERROR_SUCCESS == result)
|
||
|
{
|
||
|
DWORD cbBuffer = sizeof(WCHAR) * cchBufferMax;
|
||
|
result = RegQueryValueEx(hKey, L"svcVersion", NULL, NULL, (BYTE*)pszBuffer, &cbBuffer);
|
||
|
if (ERROR_SUCCESS != result
|
||
|
|| L'\0' == *pszBuffer)
|
||
|
{
|
||
|
cbBuffer = sizeof(WCHAR) * cchBufferMax;
|
||
|
result = RegQueryValueEx(hKey, L"Version", NULL, NULL, (BYTE*)pszBuffer, &cbBuffer);
|
||
|
}
|
||
|
RegCloseKey(hKey);
|
||
|
}
|
||
|
|
||
|
if (ERROR_SUCCESS != result)
|
||
|
{
|
||
|
*pszBuffer = L'\0';
|
||
|
return HRESULT_FROM_WIN32(result);
|
||
|
}
|
||
|
|
||
|
return S_OK;
|
||
|
}
|
||
|
|
||
|
HRESULT MSIE_GetVersion(INT *majorOut, INT *minorOut, INT *buildOut, INT *subBuildOut)
|
||
|
{
|
||
|
INT szVersion[4] = { 0, 0, 0, 0};
|
||
|
WCHAR szBuffer[64] = {0};
|
||
|
HRESULT hr = MSIE_GetVersionString(szBuffer, ARRAYSIZE(szBuffer));
|
||
|
if (SUCCEEDED(hr))
|
||
|
{
|
||
|
INT index = 0;
|
||
|
LPWSTR block = szBuffer;
|
||
|
LPWSTR cursor = block;
|
||
|
|
||
|
for(;;)
|
||
|
{
|
||
|
if (L'\0' == *cursor)
|
||
|
{
|
||
|
if (block != cursor && FALSE != StrToIntEx(block,STIF_DEFAULT, &szVersion[index]))
|
||
|
index++;
|
||
|
break;
|
||
|
}
|
||
|
else if (L'.' == *cursor)
|
||
|
{
|
||
|
*cursor = L'\0';
|
||
|
if (block != cursor && FALSE != StrToIntEx(block,STIF_DEFAULT, &szVersion[index]))
|
||
|
{
|
||
|
index++;
|
||
|
if (index == ARRAYSIZE(szVersion))
|
||
|
break; // too many numbers
|
||
|
}
|
||
|
cursor++;
|
||
|
block = cursor;
|
||
|
}
|
||
|
cursor++;
|
||
|
}
|
||
|
|
||
|
if (index < ARRAYSIZE(szVersion))
|
||
|
hr = E_FAIL;
|
||
|
}
|
||
|
|
||
|
if (NULL != majorOut) *majorOut = szVersion[0];
|
||
|
if (NULL != minorOut) *minorOut = szVersion[1];
|
||
|
if (NULL != buildOut) *buildOut = szVersion[2];
|
||
|
if (NULL != subBuildOut) *subBuildOut = szVersion[3];
|
||
|
|
||
|
return hr;
|
||
|
}
|