Win32 , C++

실행 파일의 버전 정보 확인하기

김모작자 2013. 7. 5. 12:02

resource 에 기록된 파일의 정보를 읽는 함수
GetFileVersionInfoSize 두번째 파라미터가 아닌 return 되는 값을 확인해야 한다는 거에 유의!

 

CODE.txt

 

// 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;
}