#include "FileUtilities.h"
#include "StringUtilities.h"
#define FILE_LANGUAGE_INFO L"\\VarFileInfo\\Translation"
#define FILE_VERSION_INFO L"\\StringFileInfo\\%04x%04x\\FileVersion"
namespace webdriver {
FileUtilities::FileUtilities(void) {
}
FileUtilities::~FileUtilities(void) {
}
std::string FileUtilities::GetFileVersion(const std::string& file_name) {
return GetFileVersion(StringUtilities::ToWString(file_name));
}
std::string FileUtilities::GetFileVersion(const std::wstring& file_name) {
struct LANGANDCODEPAGE {
WORD language;
WORD code_page;
} *language_info;
DWORD dummy = 0;
DWORD length = ::GetFileVersionInfoSize(file_name.c_str(), &dummy);
if (length == 0) {
return "";
}
std::vector<char> version_buffer(length);
::GetFileVersionInfo(file_name.c_str(),
0,
length,
&version_buffer[0]);
UINT page_count;
BOOL query_result = ::VerQueryValue(&version_buffer[0],
FILE_LANGUAGE_INFO,
reinterpret_cast<void**>(&language_info),
&page_count);
std::vector<wchar_t> sub_block(MAX_PATH);
_snwprintf_s(&sub_block[0],
MAX_PATH,
MAX_PATH,
FILE_VERSION_INFO,
language_info->language,
language_info->code_page);
std::wstring sub_block_string = &sub_block[0];
void* value = NULL;
unsigned int size;
query_result = ::VerQueryValue(&version_buffer[0],
sub_block_string.c_str(),
&value,
&size);
std::wstring wide_version;
wide_version.assign(static_cast<wchar_t*>(value));
std::string version = StringUtilities::ToString(wide_version);
return version;
}
}