[MFC] 버전 정보 문자열로 얻기

파일의 버전을 API를 통해 알아내려면 어떻게 해야 할까요?

MFC 프로젝트를 만들면 리소스에 Version 정보를 확인 할 수 있습니다.
Resource의 한 타입으로 VERSIONINFO라는 것이 존재합니다. 이는 리소스 탭의 VS_VERSION_INFO 를 통해 확인할수 있습니다.
여기에 해당 파일의 버전 정보를 기록하도록 되어있습니다.
이 버전 정보를 읽어오는 팁을 공개합니다.

[MFC] 버전 정보 문자열로 얻기
그림1. 리소스의 파일버전

1. 해당 함수 라이브러리 추가

Winapi 함수인 VerQueryValue 를 수행하기 위해서 다음 라이브러리를 추가 시켜주야 합니다.
Version 을 알아오기 위해서는 Version.lib 를 링크시켜 줍니다.

[MFC] 버전 정보 문자열로 얻기
그림2. 라이브러리 추가

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());
}
[MFC] 버전 정보 문자열로 얻기
그림3. 출력

Leave a Comment