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;
    }

  • 相关阅读:
    Java实现 蓝桥杯 算法训练 画图(暴力)
    Java实现 蓝桥杯 算法训练 画图(暴力)
    Java实现 蓝桥杯 算法训练 相邻数对(暴力)
    Java实现 蓝桥杯 算法训练 相邻数对(暴力)
    Java实现 蓝桥杯 算法训练 相邻数对(暴力)
    Java实现 蓝桥杯 算法训练 Cowboys
    Java实现 蓝桥杯 算法训练 Cowboys
    55. Jump Game
    54. Spiral Matrix
    50. Pow(x, n)
  • 原文地址:https://www.cnblogs.com/hgy413/p/3693458.html
Copyright © 2011-2022 走看看