Added GetDllVersion /ProductVersion switch

git-svn-id: https://svn.code.sf.net/p/nsis/code/NSIS/trunk@7310 212acab6-be3b-0410-9dea-997c60f758d6
This commit is contained in:
anders_k 2021-08-30 00:06:25 +00:00
parent 52d6782447
commit 3a3d2202a7
10 changed files with 36 additions and 30 deletions

View file

@ -334,7 +334,7 @@ static bool GetTLBVersionUsingAPI(const TCHAR *filepath, DWORD &high, DWORD &low
}
#endif //~ !_WIN32
bool GetTLBVersion(const TCHAR *filepath, DWORD &high, DWORD &low)
bool GetTLBVersion(const TCHAR *filepath, DWORD &high, DWORD &low, bool NotUsed)
{
bool found = false;
#if defined(_WIN32) && !defined(NSIS_GETTLBVERSION_FORCEINTERNAL)
@ -345,11 +345,11 @@ bool GetTLBVersion(const TCHAR *filepath, DWORD &high, DWORD &low)
return found;
}
static bool GetDLLVersionUsingRE(const TCHAR *filepath, DWORD &high, DWORD &low)
static bool GetDLLVersionUsingRE(const TCHAR *filepath, DWORD &high, DWORD &low, bool Product)
{
bool found = false;
LANGID anylangid = CResourceEditor::ANYLANGID;
unsigned long fileSize;
unsigned long fileSize, fieldofs = Product ? 2 : 0;
void*pFileData = alloc_and_read_file(filepath, fileSize);
if (!pFileData) return false;
try
@ -369,7 +369,7 @@ static bool GetDLLVersionUsingRE(const TCHAR *filepath, DWORD &high, DWORD &low)
VS_FIXEDFILEINFO *verinfo = (VS_FIXEDFILEINFO*)(resdata + len);
if (ressize >= len + sizeof(VS_FIXEDFILEINFO) && verinfo->dwSignature == FIX_ENDIAN_INT32(VS_FFI_SIGNATURE))
{
high = FIX_ENDIAN_INT32(verinfo->dwFileVersionMS), low = FIX_ENDIAN_INT32(verinfo->dwFileVersionLS);
high = FIX_ENDIAN_INT32((&verinfo->dwFileVersionMS)[fieldofs]), low = FIX_ENDIAN_INT32((&verinfo->dwFileVersionLS)[fieldofs]);
found = true;
}
}
@ -383,11 +383,11 @@ static bool GetDLLVersionUsingRE(const TCHAR *filepath, DWORD &high, DWORD &low)
return found;
}
static bool GetDLLVersionUsingAPI(const TCHAR *filepath, DWORD &high, DWORD &low)
static bool GetDLLVersionUsingAPI(const TCHAR *filepath, DWORD &high, DWORD &low, bool Product)
{
bool found = false;
#ifdef _WIN32
TCHAR path[1024], *name;
TCHAR path[1024], *name, fieldofs = Product ? 2 : 0;
path[0] = 0;
GetFullPathName(filepath, 1024, path, &name);
@ -401,7 +401,7 @@ static bool GetDLLVersionUsingAPI(const TCHAR *filepath, DWORD &high, DWORD &low
VS_FIXEDFILEINFO *pvsf;
if (GetFileVersionInfo(path, 0, verSize, buf) && VerQueryValue(buf, _T("\\"), (void**) &pvsf, &valSize))
{
high = pvsf->dwFileVersionMS, low = pvsf->dwFileVersionLS;
high = (&pvsf->dwFileVersionMS)[fieldofs], low = (&pvsf->dwFileVersionLS)[fieldofs];
found = true;
}
free(buf);
@ -420,11 +420,11 @@ typedef struct tagMINI_IMAGE_VXD_HEADER {
} MINI_IMAGE_VXD_HEADER, *PMINI_IMAGE_VXD_HEADER;
#pragma pack(pop)
static bool GetDLLVersionFromVXD(const TCHAR *filepath, DWORD &high, DWORD &low)
static bool GetDLLVersionFromVXD(const TCHAR *filepath, DWORD &high, DWORD &low, bool Product)
{
bool found = false;
FILEVIEW map;
char *filedata = create_file_view_readonly(filepath, map);
char *filedata = create_file_view_readonly(filepath, map), fieldofs = Product ? 2 : 0;
if (filedata)
{
PIMAGE_DOS_HEADER pDosHdr = (PIMAGE_DOS_HEADER) filedata;
@ -452,7 +452,7 @@ static bool GetDLLVersionFromVXD(const TCHAR *filepath, DWORD &high, DWORD &low)
VS_FIXEDFILEINFO *pFFI = MKPTR(VS_FIXEDFILEINFO*, pVSVI, 2 + 2 + 16);
if (LE2HE32(pFFI->dwSignature) == 0xFEEF04BD)
{
high = LE2HE32(pFFI->dwFileVersionMS), low = LE2HE32(pFFI->dwFileVersionLS);
high = LE2HE32((&pFFI->dwFileVersionMS)[fieldofs]), low = LE2HE32((&pFFI->dwFileVersionLS)[fieldofs]);
found = true;
}
}
@ -465,11 +465,11 @@ static bool GetDLLVersionFromVXD(const TCHAR *filepath, DWORD &high, DWORD &low)
return found;
}
bool GetDLLVersion(const TCHAR *filepath, DWORD &high, DWORD &low)
bool GetDLLVersion(const TCHAR *filepath, DWORD &high, DWORD &low, bool Product)
{
bool result = GetDLLVersionUsingAPI(filepath, high, low);
if (!result) result = GetDLLVersionUsingRE(filepath, high, low);
if (!result) result = GetDLLVersionFromVXD(filepath, high, low);
bool result = GetDLLVersionUsingAPI(filepath, high, low, Product);
if (!result) result = GetDLLVersionUsingRE(filepath, high, low, Product);
if (!result) result = GetDLLVersionFromVXD(filepath, high, low, Product);
return result;
}