resource 에 기록된 파일의 정보를 읽는 함수
GetFileVersionInfoSize 두번째 파라미터가 아닌 return 되는 값을 확인해야 한다는 거에 유의!
// filename : 조회하려는 파일 전체 경로 (NULL 전달시 현재 실행 파일을 조회)
// FileVersion :: VER 리소스의 파일 버전
// ProductVersion :: VER 리소스의 PRODUCT_VERSION
void GetModuleVersion(LPCTSTR filename, CString& FileVersion, CString& ProductVersion )
{
LPCTSTR filepath = filename;
TCHAR module[1024];
if(filepath == nullptr)
{
GetModuleFileName(nullptr, module, 1024);
filepath = module;
}
FileVersion.Empty();
ProductVersion.Empty();
DWORD data_len = 0, Handle = 0;
data_len = ::GetFileVersionInfoSize(filepath, &Handle); // data_len 이 필요, Handle 은 뭐에 쓰는거임?
if(data_len == 0)
return ;
LPVOID data = (LPVOID) new BYTE[data_len];
if(::GetFileVersionInfo(filepath, 0, data_len, data))
{
LPVOID ptr = NULL;
UINT len = 0;
if( VerQueryValue( data, _T("\\"), &ptr, &len) && ptr != nullptr)
{
VS_FIXEDFILEINFO* info = (VS_FIXEDFILEINFO*) ptr;
FileVersion.Format(_T("%u.%u.%u.%u"), info->dwFileVersionMS >> 16, info->dwFileVersionMS & 0xFFFF,
info->dwFileVersionLS >> 16 , info->dwProductVersionLS & 0xFFFF);
ProductVersion.Format(_T("%u.%u.%u.%u"), info->dwProductVersionMS >> 16, info->dwProductVersionMS & 0xFFFF,
info->dwProductVersionLS >> 16 , info->dwProductVersionLS & 0xFFFF);
}
}
delete (LPBYTE)data;
}