#include "stdafx.h"
#include "bindinstall.h"
#include "VersionInfo.h"
#include <winver.h>
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
CVersionInfo::CVersionInfo(CString filename)
{
HANDLE hFile;
WIN32_FIND_DATA fd;
memset(&fd, 0, sizeof(WIN32_FIND_DATA));
m_status = ERROR_SUCCESS;
m_isValid = FALSE;
m_filename = filename;
hFile = FindFirstFile(filename, &fd);
if(hFile == INVALID_HANDLE_VALUE)
{
m_status = ERROR_FILE_NOT_FOUND;
m_versionInfo = NULL;
return;
}
FindClose(hFile);
DWORD handle;
DWORD viSize = GetFileVersionInfoSize((LPTSTR)(LPCTSTR)filename, &handle);
m_versionInfo = NULL;
if(viSize == 0)
{
m_status = GetLastError();
}
else
{
m_versionInfo = new char[viSize];
if(!GetFileVersionInfo((LPTSTR)(LPCTSTR)filename, handle, viSize, m_versionInfo))
{
if(m_versionInfo)
{
delete [] m_versionInfo;
m_versionInfo = NULL;
}
return;
}
UINT versionLen = 0;
LPVOID viBlob = NULL;
if(!VerQueryValue(m_versionInfo, "\\", &viBlob, &versionLen))
{
if(m_versionInfo)
{
delete [] m_versionInfo;
m_versionInfo = NULL;
}
return;
}
m_fixedInfo = (VS_FIXEDFILEINFO *)viBlob;
UINT blobLen = 0;
}
m_isValid = TRUE;
}
CVersionInfo::~CVersionInfo()
{
m_fixedInfo = NULL;
if(m_versionInfo)
{
delete [] m_versionInfo;
m_versionInfo = NULL;
}
}
CString CVersionInfo::GetFileVersionString()
{
return(QueryStringValue("FileVersion"));
}
CString CVersionInfo::GetProductVersionString()
{
return(QueryStringValue("ProductVersion"));
}
CString CVersionInfo::GetComments()
{
return(QueryStringValue("Comments"));
}
CString CVersionInfo::GetFileDescription()
{
return(QueryStringValue("FileDescription"));
}
CString CVersionInfo::GetInternalName()
{
return(QueryStringValue("InternalName"));
}
CString CVersionInfo::GetLegalCopyright()
{
return(QueryStringValue("LegalCopyright"));
}
CString CVersionInfo::GetLegalTrademarks()
{
return(QueryStringValue("LegalTrademarks"));
}
CString CVersionInfo::GetOriginalFileName()
{
return(QueryStringValue("OriginalFilename"));
}
CString CVersionInfo::GetProductName()
{
return(QueryStringValue("ProductName"));
}
CString CVersionInfo::GetSpecialBuildString()
{
return(QueryStringValue("SpecialBuild"));
}
CString CVersionInfo::GetPrivateBuildString()
{
return(QueryStringValue("PrivateBuild"));
}
CString CVersionInfo::GetCompanyName()
{
return(QueryStringValue("CompanyName"));
}
#ifdef NOTUSED
BOOL CVersionInfo::CopyFileCheckVersion(CVersionInfo &originalFile)
{
_int64 myVer = GetFileVersion();
_int64 origVer = originalFile.GetFileVersion();
if(origVer > myVer)
{
CString msg;
msg.Format(IDS_EXISTING_NEWER, m_filename);
DWORD query = AfxMessageBox(msg, MB_YESNO);
if(query == IDNO)
return(TRUE);
}
return(CopyFileNoVersion(originalFile));
}
#endif
BOOL CVersionInfo::CopyFileNoVersion(CVersionInfo &originalFile)
{
int x = 7;
return(CopyFile(originalFile.GetFilename(), m_filename, FALSE));
}
_int64 CVersionInfo::GetFileVersion()
{
_int64 ver = 0;
if(m_versionInfo)
{
ver = m_fixedInfo->dwFileVersionMS;
ver <<= 32;
ver += m_fixedInfo->dwFileVersionLS;
}
return(ver);
}
_int64 CVersionInfo::GetProductVersion()
{
_int64 ver = 0;
if(m_versionInfo)
{
ver = m_fixedInfo->dwProductVersionMS;
ver <<= 32;
ver += m_fixedInfo->dwProductVersionLS;
}
return(ver);
}
_int64 CVersionInfo::GetFileDate()
{
_int64 fDate = 0;
if(m_versionInfo)
{
fDate = m_fixedInfo->dwFileDateMS;
fDate <<= 32;
fDate += m_fixedInfo->dwFileDateLS;
}
return(fDate);
}
DWORD CVersionInfo::GetFileFlagMask()
{
if(m_versionInfo)
{
return(m_fixedInfo->dwFileFlagsMask);
}
return(0);
}
DWORD CVersionInfo::GetFileFlags()
{
if(m_versionInfo)
{
return(m_fixedInfo->dwFileFlags);
}
return(0);
}
DWORD CVersionInfo::GetFileOS()
{
if(m_versionInfo)
{
return(m_fixedInfo->dwFileOS);
}
return(VOS_UNKNOWN);
}
DWORD CVersionInfo::GetFileType()
{
if(m_versionInfo)
{
return(m_fixedInfo->dwFileType);
}
return(VFT_UNKNOWN);
}
DWORD CVersionInfo::GetFileSubType()
{
if(m_versionInfo)
{
return(m_fixedInfo->dwFileSubtype);
}
return(VFT2_UNKNOWN);
}
CString CVersionInfo::QueryStringValue(CString value)
{
UINT blobLen = 0;
LPVOID viBlob = NULL;
if(m_versionInfo)
{
char queryString[256];
DWORD codePage = 0x040904B0;
sprintf(queryString, "\\StringFileInfo\\%08X\\%s", codePage, value);
if(VerQueryValue(m_versionInfo, queryString, &viBlob, &blobLen))
return((char *)viBlob);
}
return("Not Available");
}