|  | @@ -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,
 |