#include "version.h" #include "pch.h" char version[16]; char NSUserAgent[32]; void InitialiseVersion() { HRSRC hResInfo; DWORD dwSize; HGLOBAL hResData; LPVOID pRes, pResCopy; UINT uLen = 0; VS_FIXEDFILEINFO* lpFfi = NULL; HINSTANCE hInst = ::GetModuleHandle(NULL); hResInfo = FindResourceW(hInst, MAKEINTRESOURCE(1), RT_VERSION); if (hResInfo != NULL) { dwSize = SizeofResource(hInst, hResInfo); hResData = LoadResource(hInst, hResInfo); if (hResData != NULL) { pRes = LockResource(hResData); pResCopy = LocalAlloc(LMEM_FIXED, dwSize); if (pResCopy != 0) { CopyMemory(pResCopy, pRes, dwSize); VerQueryValueW(pResCopy, L"\\", (LPVOID*)&lpFfi, &uLen); DWORD dwFileVersionMS = lpFfi->dwFileVersionMS; DWORD dwFileVersionLS = lpFfi->dwFileVersionLS; DWORD dwLeftMost = HIWORD(dwFileVersionMS); DWORD dwSecondLeft = LOWORD(dwFileVersionMS); DWORD dwSecondRight = HIWORD(dwFileVersionLS); DWORD dwRightMost = LOWORD(dwFileVersionLS); // We actually use the rightmost integer do determine whether or not we're a debug/dev build // If it is set to 1 (as in resources.rc), we are a dev build // On github CI, we set this 1 to a 0 automatically as we replace the 0.0.0.1 with the real version number if (dwRightMost == 1) { sprintf(version, "%d.%d.%d.%d+dev", dwLeftMost, dwSecondLeft, dwSecondRight, dwRightMost); sprintf(NSUserAgent, "R2Northstar/%d.%d.%d+dev", dwLeftMost, dwSecondLeft, dwSecondRight); } else { sprintf(version, "%d.%d.%d.%d", dwLeftMost, dwSecondLeft, dwSecondRight, dwRightMost); sprintf(NSUserAgent, "R2Northstar/%d.%d.%d", dwLeftMost, dwSecondLeft, dwSecondRight); } UnlockResource(hResData); FreeResource(hResData); LocalFree(pResCopy); return; } UnlockResource(hResData); FreeResource(hResData); LocalFree(pResCopy); } } // Could not locate version info for whatever reason spdlog::error("Failed to load version info:\n{}", std::system_category().message(GetLastError())); sprintf(NSUserAgent, "R2Northstar/0.0.0"); }