zoukankan      html  css  js  c++  java
  • 通过关键系统文件判断正确的操作系统版本

    typedef struct tagTRANSLATION
    {
    	WORD langID;            // language ID
    	WORD charset;            // character set (code page)
    } TRANSLATION;
    
    #define  KeyFILENAMECHECK  "\\kernel32.dll"
    
    DWORD GetVersionExFromFile(OSVERSIONINFOEX &osvi)
    {
    	BOOL bOsVersionInfoEx;
    	TCHAR szSysDir[MAX_PATH] = {0};
    	TCHAR szFileName[MAX_PATH+sizeof(KeyFILENAMECHECK)] = {0};
    
    	TRANSLATION translation;
    
    	DWORD dwDummyHandle;
    	DWORD len = 0;
    	BYTE *pVerBuf = NULL;
    	LPVOID pInfoVal;
    	unsigned int dwInfoValSize;
    	char INFO[MAX_PATH] = {0};
    	int iMajorVer, iMinorVer;
    
    	ZeroMemory(&osvi, sizeof(OSVERSIONINFOEX));
    	osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
    
    	if ((bOsVersionInfoEx = GetVersionEx((OSVERSIONINFO*)&osvi)) == 0)
    	{
    		// If OSVERSIONINFOEX doesn't work, try OSVERSIONINFO.
    		osvi.dwOSVersionInfoSize = sizeof (OSVERSIONINFO);
    
    		if (!GetVersionEx((OSVERSIONINFO *)&osvi))
    		{
    			return FALSE;
    		}
    	}
    
    	// 通过关键系统文件判断正确的操作系统版本
    	GetSystemDirectory(szSysDir, MAX_PATH);
    	_snprintf(szFileName, sizeof(szFileName) - 1, "%s%s", szSysDir, KeyFILENAMECHECK);
    
    	//将版本信息资源读入缓冲区
    	len = GetFileVersionInfoSize(szFileName, &dwDummyHandle);
    
    	if (len > 0)
    	{
    		pVerBuf = (BYTE *)LocalAlloc(LHND, len);
    	}
    
    	if (pVerBuf
    		&& GetFileVersionInfo(szFileName, 0, len, pVerBuf))
    	{
    		translation.langID = MAKELANGID(LANG_ENGLISH,SUBLANG_ENGLISH_US);
    
    		if (VerQueryValue(pVerBuf,
    			TEXT("\\VarFileInfo\\Translation"),
    			&pInfoVal, &dwInfoValSize)
    			&& dwInfoValSize >= 4)
    		{
    			translation = *(TRANSLATION*)pInfoVal;
    		}
    
    		_snprintf(INFO,
    			sizeof(INFO) - 1,
    			"\\StringFileInfo\\%04x%04x\\FileVersion",
    			translation.langID,
    			translation.charset);
    
    		//获得具体的版本号
    		VerQueryValue(pVerBuf, (LPSTR)INFO, &pInfoVal, &dwInfoValSize);
    
    		iMajorVer = *((char*)pInfoVal) - '0';
    		iMinorVer = *((char*)pInfoVal + 2) - '0';
    
    		// 取文件版本成功则使用文件版本,此处也可判断是否运行在兼容模式下
    		osvi.dwMajorVersion = iMajorVer;
    		osvi.dwMinorVersion = iMinorVer;
    
    	}
    
    	if (pVerBuf)
    	{
    		memset(pVerBuf, 0, len);
    		LocalFree(pVerBuf);
    	}
    
    	return TRUE;
    
    }
    
    int main()
    {
    	OSVERSIONINFOEX osvi;
    	GetVersionExFromFile(osvi);
    
    	return 0;
    }

  • 相关阅读:
    小数化分数2
    Sum of divisors
    Subsequence
    Lowest Bit
    Specialized Four-Digit Numbers
    Hunters
    Pet
    测试你是否和LTC水平一样高
    Bank Interest
    bzoj 1295
  • 原文地址:https://www.cnblogs.com/hgy413/p/3693458.html
Copyright © 2011-2022 走看看