GetFileInfo
CUIAction::GetFileVersion2
GetSystemDirectory
WCHAR szConfigFile[MAX_PATH + 1];
::GetSystemDirectory(szConfigFile, MAX_PATH);
::PathAppend(szConfigFile, FileBootCleanConfigFileName);
void GetApplicationVersion(char * strVersion) { TCHAR szFullPath[MAX_PATH]; DWORD dwVerInfoSize = 0; DWORD dwVerHnd; VS_FIXEDFILEINFO * pFileInfo; GetModuleFileName(NULL, szFullPath, sizeof(szFullPath)); dwVerInfoSize = GetFileVersionInfoSize(szFullPath, &dwVerHnd); if (dwVerInfoSize) { // If we were able to get the information, process it: HANDLE hMem; LPVOID lpvMem; unsigned int uInfoSize = 0; hMem = GlobalAlloc(GMEM_MOVEABLE, dwVerInfoSize); lpvMem = GlobalLock(hMem); GetFileVersionInfo(szFullPath, dwVerHnd, dwVerInfoSize, lpvMem); ::VerQueryValue(lpvMem, (LPTSTR)("\\"), (void**)&pFileInfo, &uInfoSize); WORD m_nProdVersion[4]; // Product version from the FILEVERSION of the version info resource m_nProdVersion[0] = HIWORD(pFileInfo->dwProductVersionMS); m_nProdVersion[1] = LOWORD(pFileInfo->dwProductVersionMS); m_nProdVersion[2] = HIWORD(pFileInfo->dwProductVersionLS); m_nProdVersion[3] = LOWORD(pFileInfo->dwProductVersionLS); sprintf(strVersion, "%d.%d.%d.%d", m_nProdVersion[0], m_nProdVersion[1],m_nProdVersion[2],m_nProdVersion[3]); GlobalUnlock(hMem); GlobalFree(hMem); } else { strcpy(strVersion, "1.0"); } }
BOOL CModuleVersion::GetDLLVersionInfo(LPCTSTR filename) { m_translation.charset = 1252; // default = ANSI code page memset((VS_FIXEDFILEINFO*)this, 0, sizeof(VS_FIXEDFILEINFO)); // get module handle //HMODULE hModule = LoadLibrary(filename); //if (hModule==NULL) // return FALSE; // some times, LoadLibrary may fail , --- by bbcallen HMODULE hModule = LoadLibraryEx(filename, NULL, LOAD_LIBRARY_AS_DATAFILE); if (hModule==NULL) return FALSE; // read file version info DWORD dwDummyHandle; // will always be set to zero DWORD len = GetFileVersionInfoSize(filename, &dwDummyHandle); if (len <= 0) { FreeLibrary(hModule); return FALSE; } BYTE* pbData = new BYTE[len]; // allocate version info if (!pbData) { FreeLibrary(hModule); return FALSE; } m_atpVersionInfo.Attach(pbData); if (!::GetFileVersionInfo(filename, 0, len, m_atpVersionInfo)) { FreeLibrary(hModule); return FALSE; } LPVOID lpvi; UINT iLen; if (!VerQueryValue(m_atpVersionInfo, _T("\\"), &lpvi, &iLen)) { FreeLibrary(hModule); return FALSE; } // copy fixed info to myself, which am derived from VS_FIXEDFILEINFO *(VS_FIXEDFILEINFO*)this = *(VS_FIXEDFILEINFO*)lpvi; // Get translation info if (VerQueryValue(m_atpVersionInfo, _T("\\VarFileInfo\\Translation"), &lpvi, &iLen) && iLen >= 4) { m_translation = *(TRANSLATION*)lpvi; } FreeLibrary(hModule); return dwSignature == VS_FFI_SIGNATURE; }
CString CGlobalFun::getIEVersion() { 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); } } CString strVersion; strVersion.Format(_T("MSIE %d.%d"),dwMajorVersion,dwMinorVersion); /*printf("mshtml.dll VersionInfo: \n\tMajorVersion=%d\n\tMinorVersion=%d\n\tBuildNumber=%d\n\tRevisionNumber=%d\n", dwMajorVersion, dwMinorVersion, dwBuildNumber, dwRevisionNumber); */ return strVersion; }
HRESULT CBootCheckTool::CopyDriverIfNew(LPCWSTR lpszNewDriver) { WCHAR szOldDriver[MAX_PATH + 1]; UINT uRet = ::GetSystemDirectory(szOldDriver, MAX_PATH); if (!uRet) return GetLastError() ? AtlHresultFromLastError() : E_FAIL; ::PathAppend(szOldDriver, L"Drivers"); ::PathAppend(szOldDriver, BC_DriverFileName); ULARGE_INTEGER uiOldVersion = GetDllVersion(szOldDriver); ULARGE_INTEGER uiNewVersion = GetDllVersion(lpszNewDriver); if (uiNewVersion.QuadPart <= uiOldVersion.QuadPart) return S_FALSE; // 不需要拷贝 // 拷贝较新的版本 BOOL br = ::CopyFile(lpszNewDriver, szOldDriver, FALSE); if (!br) return GetLastError() ? AtlHresultFromLastError() : E_FAIL; return S_OK; } ULARGE_INTEGER CBootCheckTool::GetDllVersion(LPCWSTR lpszFilePath) { BOOL bRet = FALSE; DWORD dwHandle = 0; DWORD dwFileInfoSize = 0; VS_FIXEDFILEINFO *pFixFileInfo = NULL; TCHAR *pszFileInfo = NULL; UINT uLen = 0; ULARGE_INTEGER uiVersion; uiVersion.HighPart = 0; uiVersion.LowPart = 0; dwFileInfoSize = ::GetFileVersionInfoSize(lpszFilePath, &dwHandle); if (dwFileInfoSize == 0) goto Exit0; pszFileInfo = new TCHAR[dwFileInfoSize]; if (pszFileInfo == NULL) goto Exit0; bRet = ::GetFileVersionInfo(lpszFilePath, dwHandle, dwFileInfoSize, pszFileInfo); if (!bRet) goto Exit0; bRet = ::VerQueryValue(pszFileInfo, _T("\\"), (LPVOID *)&pFixFileInfo, &uLen); if (!bRet) goto Exit0; if (uLen > 0) { uiVersion.HighPart = pFixFileInfo->dwFileVersionMS; uiVersion.LowPart = pFixFileInfo->dwFileVersionLS; } Exit0: if (pszFileInfo) { delete pszFileInfo; pszFileInfo = NULL; } return uiVersion; }
原文地址:http://www.cnblogs.com/chunyou128/p/3830512.html