파일의 버전을 API를 통해 알아내려면 어떻게 해야 할까요?
MFC 프로젝트를 만들면 리소스에 Version 정보를 확인 할 수 있습니다.
Resource의 한 타입으로 VERSIONINFO라는 것이 존재합니다. 이는 리소스 탭의 VS_VERSION_INFO 를 통해 확인할수 있습니다.
여기에 해당 파일의 버전 정보를 기록하도록 되어있습니다.
이 버전 정보를 읽어오는 팁을 공개합니다.
1. 해당 함수 라이브러리 추가
Winapi 함수인 VerQueryValue 를 수행하기 위해서 다음 라이브러리를 추가 시켜주야 합니다.
Version 을 알아오기 위해서는 Version.lib 를 링크시켜 줍니다.
VerQueryValue는 지정된 버전 정보 리소스에서 지정된 버전 정보를 검색하는 함수 입니다.
2. 샘플코드
다음에 버전을 가져오는 Full Source 입니다.
CString CMFCApplication1Dlg::GetVersion()
{
CString ret;
HRSRC hRsrc = FindResource(NULL, MAKEINTRESOURCE(VS_VERSION_INFO), RT_VERSION);
if (hRsrc != NULL)
{
HGLOBAL hGlobalMemory = LoadResource(NULL, hRsrc);
if (hGlobalMemory != NULL)
{
CString rVersion;
LPVOID pVersionResouece = LockResource(hGlobalMemory);
LPVOID pVersion = NULL;
DWORD uLength, langD;
BOOL retVal;
LPCTSTR lpSubBlock = _T("\\VarFileInfo\\Translation");
retVal = VerQueryValue(pVersionResouece, lpSubBlock, (LPVOID*)&pVersion, (UINT*)&uLength);
if (retVal && uLength == 4)
{
memcpy(&langD, pVersion, 4);
//ProductVersion <-> FileVersion
rVersion.Format(_T("\\StringFileInfo\\%02X%02X%02X%02X\\FileVersion"),
(langD & 0xff00) >> 8, langD & 0xff, (langD & 0xff000000) >> 24,
(langD & 0xff0000) >> 16);
}
else
{
//ProductVersion <-> FileVersion
rVersion.Format(_T("\\StringFileInfo\\%04X04B0\\FileVersion"), GetUserDefaultLangID());
}
if (VerQueryValue(pVersionResouece, (LPCTSTR)rVersion, (LPVOID*)&pVersion, (UINT*)&uLength) != 0)
{
ret.Format(_T("%s"), (LPCTSTR)pVersion);
}
FreeResource(hGlobalMemory);
}
}
return ret;
}
위 함수를 버튼에 연결하여 보여주면 다음 처럼 보여집니다.
void CMFCApplication1Dlg::OnBnClickedVersion()
{
AfxMessageBox(GetVersion());
}