|
@@ -11,141 +11,6 @@
|
|
|
//---------------------------------------------------------------------------
|
|
|
#pragma package(smart_init)
|
|
|
//---------------------------------------------------------------------------
|
|
|
-#define DWORD_ALIGN( base, ptr ) \
|
|
|
- ( (LPBYTE)(base) + ((((LPBYTE)(ptr) - (LPBYTE)(base)) + 3) & ~3) )
|
|
|
-struct VS_VERSION_INFO_STRUCT32
|
|
|
-{
|
|
|
- WORD wLength;
|
|
|
- WORD wValueLength;
|
|
|
- WORD wType;
|
|
|
- WCHAR szKey[1];
|
|
|
-};
|
|
|
-//---------------------------------------------------------------------------
|
|
|
-unsigned int VERSION_GetFileVersionInfo_PE(const wchar_t * FileName, unsigned int DataSize, void * Data)
|
|
|
-{
|
|
|
- unsigned int Len;
|
|
|
-
|
|
|
- bool NeedFree = false;
|
|
|
- HMODULE Module = GetModuleHandle(FileName);
|
|
|
- if (Module == NULL)
|
|
|
- {
|
|
|
- Module = LoadLibraryEx(FileName, 0, LOAD_LIBRARY_AS_DATAFILE);
|
|
|
- NeedFree = true;
|
|
|
- }
|
|
|
- if (Module == NULL)
|
|
|
- {
|
|
|
- Len = 0;
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- try
|
|
|
- {
|
|
|
- HRSRC Rsrc = FindResource(Module, MAKEINTRESOURCE(VS_VERSION_INFO),
|
|
|
- MAKEINTRESOURCE(VS_FILE_INFO));
|
|
|
- if (Rsrc != NULL)
|
|
|
- {
|
|
|
- Len = SizeofResource(Module, Rsrc);
|
|
|
- HANDLE Mem = LoadResource(Module, Rsrc);
|
|
|
- if (Mem != NULL)
|
|
|
- {
|
|
|
- try
|
|
|
- {
|
|
|
- VS_VERSION_INFO_STRUCT32 * VersionInfo = (VS_VERSION_INFO_STRUCT32 *)LockResource(Mem);
|
|
|
- const VS_FIXEDFILEINFO * FixedInfo =
|
|
|
- (VS_FIXEDFILEINFO *)DWORD_ALIGN(VersionInfo, VersionInfo->szKey + wcslen(VersionInfo->szKey) + 1);
|
|
|
-
|
|
|
- if (FixedInfo->dwSignature != VS_FFI_SIGNATURE)
|
|
|
- {
|
|
|
- Len = 0;
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- if (Data != NULL)
|
|
|
- {
|
|
|
- if (DataSize < Len)
|
|
|
- {
|
|
|
- Len = DataSize;
|
|
|
- }
|
|
|
- if (Len > 0)
|
|
|
- {
|
|
|
- memmove(Data, VersionInfo, Len);
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- __finally
|
|
|
- {
|
|
|
- FreeResource(Mem);
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- __finally
|
|
|
- {
|
|
|
- if (NeedFree)
|
|
|
- {
|
|
|
- FreeLibrary(Module);
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- return Len;
|
|
|
-}
|
|
|
-//---------------------------------------------------------------------------
|
|
|
-unsigned int GetFileVersionInfoSizeFix(const wchar_t * FileName, unsigned long * Handle)
|
|
|
-{
|
|
|
- unsigned int Len;
|
|
|
- if (IsWin7())
|
|
|
- {
|
|
|
- *Handle = 0;
|
|
|
- Len = VERSION_GetFileVersionInfo_PE(FileName, 0, NULL);
|
|
|
-
|
|
|
- if (Len != 0)
|
|
|
- {
|
|
|
- Len = (Len * 2) + 4;
|
|
|
- }
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- Len = GetFileVersionInfoSize(FileName, Handle);
|
|
|
- }
|
|
|
-
|
|
|
- return Len;
|
|
|
-}
|
|
|
-//---------------------------------------------------------------------------
|
|
|
-bool GetFileVersionInfoFix(const wchar_t * FileName, unsigned long Handle,
|
|
|
- unsigned int DataSize, void * Data)
|
|
|
-{
|
|
|
- bool Result;
|
|
|
-
|
|
|
- if (IsWin7())
|
|
|
- {
|
|
|
- VS_VERSION_INFO_STRUCT32 * VersionInfo = (VS_VERSION_INFO_STRUCT32*)Data;
|
|
|
-
|
|
|
- unsigned int Len = VERSION_GetFileVersionInfo_PE(FileName, DataSize, Data);
|
|
|
-
|
|
|
- Result = (Len != 0);
|
|
|
- if (Result)
|
|
|
- {
|
|
|
- static const char Signature[] = "FE2X";
|
|
|
- unsigned int BufSize = VersionInfo->wLength + strlen(Signature);
|
|
|
- unsigned int ConvBuf;
|
|
|
-
|
|
|
- if (DataSize >= BufSize)
|
|
|
- {
|
|
|
- ConvBuf = DataSize - VersionInfo->wLength;
|
|
|
- memmove(((char*)(Data)) + VersionInfo->wLength, Signature, ConvBuf > 4 ? 4 : ConvBuf );
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- Result = GetFileVersionInfo(FileName, Handle, DataSize, Data);
|
|
|
- }
|
|
|
-
|
|
|
- return Result;
|
|
|
-}
|
|
|
-//---------------------------------------------------------------------------
|
|
|
// Return pointer to file version info block
|
|
|
void * __fastcall CreateFileInfo(UnicodeString FileName)
|
|
|
{
|
|
@@ -154,13 +19,13 @@ void * __fastcall CreateFileInfo(UnicodeString FileName)
|
|
|
void * Result = NULL;
|
|
|
|
|
|
// Get file version info block size
|
|
|
- Size = GetFileVersionInfoSizeFix(FileName.c_str(), &Handle);
|
|
|
+ Size = GetFileVersionInfoSize(FileName.c_str(), &Handle);
|
|
|
// If size is valid
|
|
|
if (Size > 0)
|
|
|
{
|
|
|
Result = new char[Size];
|
|
|
// Get file version info block
|
|
|
- if (!GetFileVersionInfoFix(FileName.c_str(), Handle, Size, Result))
|
|
|
+ if (!GetFileVersionInfo(FileName.c_str(), Handle, Size, Result))
|
|
|
{
|
|
|
delete[] Result;
|
|
|
Result = NULL;
|
|
@@ -219,20 +84,6 @@ TTranslation __fastcall GetTranslation(void * FileInfo, unsigned i)
|
|
|
return P[i];
|
|
|
}
|
|
|
//---------------------------------------------------------------------------
|
|
|
-// Return the name of the specified language
|
|
|
-UnicodeString __fastcall GetLanguage(Word Language)
|
|
|
-{
|
|
|
- UINT Len;
|
|
|
- wchar_t P[256];
|
|
|
-
|
|
|
- Len = VerLanguageName(Language, P, LENOF(P));
|
|
|
- if (Len > LENOF(P))
|
|
|
- {
|
|
|
- throw Exception(L"Language not available");
|
|
|
- }
|
|
|
- return UnicodeString(P, Len);
|
|
|
-}
|
|
|
-//---------------------------------------------------------------------------
|
|
|
// Return the value of the specified file version info string using the
|
|
|
// specified translation
|
|
|
UnicodeString __fastcall GetFileInfoString(void * FileInfo,
|