| 244 | } |
| 245 | |
| 246 | std::vector<unsigned short> GetProductOrFileVersion(bool productVersion) |
| 247 | { |
| 248 | auto fileName = GetBinaryPath(true); |
| 249 | |
| 250 | DWORD dummy; |
| 251 | DWORD size = GetFileVersionInfoSizeW(fileName.data(), &dummy); |
| 252 | |
| 253 | if (size == 0) |
| 254 | { |
| 255 | TENLog("GetFileVersionInfoSizeW failed", LogLevel::Error); |
| 256 | return {}; |
| 257 | } |
| 258 | |
| 259 | std::unique_ptr<unsigned char[]> buffer(new unsigned char[size]); |
| 260 | |
| 261 | // Load version info. |
| 262 | if (!GetFileVersionInfoW(fileName.data(), 0, size, buffer.get())) |
| 263 | { |
| 264 | TENLog("GetFileVersionInfoW failed", LogLevel::Error); |
| 265 | return {}; |
| 266 | } |
| 267 | |
| 268 | VS_FIXEDFILEINFO* info; |
| 269 | unsigned int infoSize; |
| 270 | |
| 271 | if (!VerQueryValueW(buffer.get(), L"\\", (void**)&info, &infoSize)) |
| 272 | { |
| 273 | TENLog("VerQueryValueW failed", LogLevel::Error); |
| 274 | return {}; |
| 275 | } |
| 276 | |
| 277 | if (infoSize != sizeof(VS_FIXEDFILEINFO)) |
| 278 | { |
| 279 | TENLog("VerQueryValueW returned wrong size for VS_FIXEDFILEINFO", LogLevel::Error); |
| 280 | return {}; |
| 281 | } |
| 282 | |
| 283 | if (productVersion) |
| 284 | { |
| 285 | return |
| 286 | { |
| 287 | HIWORD(info->dwProductVersionMS), |
| 288 | LOWORD(info->dwProductVersionMS), |
| 289 | HIWORD(info->dwProductVersionLS), |
| 290 | LOWORD(info->dwProductVersionLS) |
| 291 | }; |
| 292 | } |
| 293 | else |
| 294 | { |
| 295 | return |
| 296 | { |
| 297 | HIWORD(info->dwFileVersionMS), |
| 298 | LOWORD(info->dwFileVersionMS), |
| 299 | HIWORD(info->dwFileVersionLS), |
| 300 | LOWORD(info->dwFileVersionLS) |
| 301 | }; |
| 302 | } |
| 303 | } |