1 // VersionInfo.cpp: implementation of the CVersionInfo class.
2 //
3 //////////////////////////////////////////////////////////////////////
4
5 #include "stdafx.h"
6 #include "bindinstall.h"
7 #include "VersionInfo.h"
8 #include <winver.h>
9
10 #ifdef _DEBUG
11 #undef THIS_FILE
12 static char THIS_FILE[]=__FILE__;
13 #define new DEBUG_NEW
14 #endif
15
16 //////////////////////////////////////////////////////////////////////
17 // Construction/Destruction
18 //////////////////////////////////////////////////////////////////////
19
CVersionInfo(CString filename)20 CVersionInfo::CVersionInfo(CString filename)
21 {
22 HANDLE hFile;
23 WIN32_FIND_DATA fd;
24 memset(&fd, 0, sizeof(WIN32_FIND_DATA));
25
26 m_status = ERROR_SUCCESS;
27 m_isValid = FALSE;
28 m_filename = filename;
29
30 // See if the given file exists
31 hFile = FindFirstFile(filename, &fd);
32 if(hFile == INVALID_HANDLE_VALUE)
33 {
34 m_status = ERROR_FILE_NOT_FOUND;
35 m_versionInfo = NULL;
36 return;
37 }
38 FindClose(hFile);
39
40 // Extract the file info
41 DWORD handle;
42 DWORD viSize = GetFileVersionInfoSize((LPTSTR)(LPCTSTR)filename, &handle);
43 m_versionInfo = NULL;
44
45 if(viSize == 0)
46 {
47 m_status = GetLastError();
48 }
49 else
50 {
51 m_versionInfo = new char[viSize];
52
53 // Get the block of version info from the file
54 if(!GetFileVersionInfo((LPTSTR)(LPCTSTR)filename, handle, viSize, m_versionInfo))
55 {
56 if(m_versionInfo)
57 {
58 delete [] m_versionInfo;
59 m_versionInfo = NULL;
60 }
61 return;
62 }
63
64 // Now extract the sub block we are interested in
65 UINT versionLen = 0;
66 LPVOID viBlob = NULL;
67 if(!VerQueryValue(m_versionInfo, "\\", &viBlob, &versionLen))
68 {
69 if(m_versionInfo)
70 {
71 delete [] m_versionInfo;
72 m_versionInfo = NULL;
73 }
74 return;
75 }
76
77 // And finally the version info is ours
78 m_fixedInfo = (VS_FIXEDFILEINFO *)viBlob;
79
80 UINT blobLen = 0;
81
82 // If we got here, all is good
83 }
84 m_isValid = TRUE;
85 }
86
~CVersionInfo()87 CVersionInfo::~CVersionInfo()
88 {
89 m_fixedInfo = NULL;
90 if(m_versionInfo)
91 {
92 delete [] m_versionInfo;
93 m_versionInfo = NULL;
94 }
95 }
96
GetFileVersionString()97 CString CVersionInfo::GetFileVersionString()
98 {
99 return(QueryStringValue("FileVersion"));
100 }
101
GetProductVersionString()102 CString CVersionInfo::GetProductVersionString()
103 {
104 return(QueryStringValue("ProductVersion"));
105 }
106
GetComments()107 CString CVersionInfo::GetComments()
108 {
109 return(QueryStringValue("Comments"));
110 }
111
GetFileDescription()112 CString CVersionInfo::GetFileDescription()
113 {
114 return(QueryStringValue("FileDescription"));
115 }
116
GetInternalName()117 CString CVersionInfo::GetInternalName()
118 {
119 return(QueryStringValue("InternalName"));
120 }
121
GetLegalCopyright()122 CString CVersionInfo::GetLegalCopyright()
123 {
124 return(QueryStringValue("LegalCopyright"));
125 }
126
GetLegalTrademarks()127 CString CVersionInfo::GetLegalTrademarks()
128 {
129 return(QueryStringValue("LegalTrademarks"));
130 }
131
GetOriginalFileName()132 CString CVersionInfo::GetOriginalFileName()
133 {
134 return(QueryStringValue("OriginalFilename"));
135 }
136
GetProductName()137 CString CVersionInfo::GetProductName()
138 {
139 return(QueryStringValue("ProductName"));
140 }
141
GetSpecialBuildString()142 CString CVersionInfo::GetSpecialBuildString()
143 {
144 return(QueryStringValue("SpecialBuild"));
145 }
146
GetPrivateBuildString()147 CString CVersionInfo::GetPrivateBuildString()
148 {
149 return(QueryStringValue("PrivateBuild"));
150 }
151
GetCompanyName()152 CString CVersionInfo::GetCompanyName()
153 {
154 return(QueryStringValue("CompanyName"));
155 }
156
157 #ifdef NOTUSED
CopyFileCheckVersion(CVersionInfo & originalFile)158 BOOL CVersionInfo::CopyFileCheckVersion(CVersionInfo &originalFile)
159 {
160 _int64 myVer = GetFileVersion();
161 _int64 origVer = originalFile.GetFileVersion();
162
163 if(origVer > myVer)
164 {
165 CString msg;
166 msg.Format(IDS_EXISTING_NEWER, m_filename);
167 DWORD query = AfxMessageBox(msg, MB_YESNO);
168 if(query == IDNO)
169 return(TRUE);
170 }
171
172 return(CopyFileNoVersion(originalFile));
173 }
174 #endif
175
CopyFileNoVersion(CVersionInfo & originalFile)176 BOOL CVersionInfo::CopyFileNoVersion(CVersionInfo &originalFile)
177 {
178 int x = 7;
179 return(CopyFile(originalFile.GetFilename(), m_filename, FALSE));
180 }
181
182
GetFileVersion()183 _int64 CVersionInfo::GetFileVersion()
184 {
185 _int64 ver = 0;
186
187 if(m_versionInfo)
188 {
189 ver = m_fixedInfo->dwFileVersionMS;
190 ver <<= 32;
191 ver += m_fixedInfo->dwFileVersionLS;
192 }
193 return(ver);
194 }
195
GetProductVersion()196 _int64 CVersionInfo::GetProductVersion()
197 {
198 _int64 ver = 0;
199
200 if(m_versionInfo)
201 {
202 ver = m_fixedInfo->dwProductVersionMS;
203 ver <<= 32;
204 ver += m_fixedInfo->dwProductVersionLS;
205 }
206 return(ver);
207 }
208
GetFileDate()209 _int64 CVersionInfo::GetFileDate()
210 {
211 _int64 fDate = 0;
212
213 if(m_versionInfo)
214 {
215 fDate = m_fixedInfo->dwFileDateMS;
216 fDate <<= 32;
217 fDate += m_fixedInfo->dwFileDateLS;
218 }
219 return(fDate);
220 }
221
GetFileFlagMask()222 DWORD CVersionInfo::GetFileFlagMask()
223 {
224 if(m_versionInfo)
225 {
226 return(m_fixedInfo->dwFileFlagsMask);
227 }
228 return(0);
229 }
230
GetFileFlags()231 DWORD CVersionInfo::GetFileFlags()
232 {
233 if(m_versionInfo)
234 {
235 return(m_fixedInfo->dwFileFlags);
236 }
237 return(0);
238 }
239
GetFileOS()240 DWORD CVersionInfo::GetFileOS()
241 {
242 if(m_versionInfo)
243 {
244 return(m_fixedInfo->dwFileOS);
245 }
246 return(VOS_UNKNOWN);
247 }
248
GetFileType()249 DWORD CVersionInfo::GetFileType()
250 {
251 if(m_versionInfo)
252 {
253 return(m_fixedInfo->dwFileType);
254 }
255 return(VFT_UNKNOWN);
256 }
257
GetFileSubType()258 DWORD CVersionInfo::GetFileSubType()
259 {
260 if(m_versionInfo)
261 {
262 return(m_fixedInfo->dwFileSubtype);
263 }
264 return(VFT2_UNKNOWN);
265 }
266
QueryStringValue(CString value)267 CString CVersionInfo::QueryStringValue(CString value)
268 {
269 UINT blobLen = 0;
270 LPVOID viBlob = NULL;
271
272 if(m_versionInfo)
273 {
274 char queryString[256];
275
276 // This code page value is for American English. If you change the resources to be other than that
277 // You probably should change this to match it.
278 DWORD codePage = 0x040904B0;
279
280 sprintf(queryString, "\\StringFileInfo\\%08X\\%s", codePage, value);
281
282 if(VerQueryValue(m_versionInfo, queryString, &viBlob, &blobLen))
283 return((char *)viBlob);
284 }
285 return("Not Available");
286 }
287