정리

[Win32 API] File Version 확인

저장소/VC++
파일 버전만 필요로 할 때가 있으려나...
간단한 파일 버전 확인 방법을 정리한다.

#include 
#pragma comment(lib, "version.lib")

int GetFileVersion(LPCTSTR _lpszFilePath, LPTSTR _lpszBuf, DWORD _cchBuf)
{
	if( NULL == _lpszFilePath	||
		NULL == _lpszBuf		)
	{
		return -1;
	}

	DWORD dwHandle = 0;
	DWORD dwSize = 0;

	dwSize = ::GetFileVersionInfoSize(_lpszFilePath, &dwHandle);
	if(0 == dwSize)
		return -1;

	BYTE* pBlockData = new BYTE[dwSize];
	ZeroMemory(pBlockData, dwSize);

	if(FALSE == ::GetFileVersionInfo(_lpszFilePath, dwHandle, dwSize, pBlockData))
	{
		delete [] pBlockData;

		return -1;
	}

	// File Version
	VS_FIXEDFILEINFO* pVerInfo = NULL;
	UINT uLen = 0;

	if(FALSE == ::VerQueryValue(pBlockData, _T("\\"), (LPVOID*)&pVerInfo, &uLen))
	{
		delete [] pBlockData;

		return -1;
	}

	StringCchPrintf(_lpszBuf, _cchBuf,
					_T("%d.%d.%d.%d"),
					HIWORD(pVerInfo->dwFileVersionMS),	// Major
					LOWORD(pVerInfo->dwFileVersionMS),	// Minor
					HIWORD(pVerInfo->dwFileVersionLS),	// Release
					LOWORD(pVerInfo->dwFileVersionLS));	// Test

	delete [] pBlockData;

	return 0;
}
VerQueryValue의 두 번째 인자인 lpSubBlock의 다른 사용 예로 VS_FIXEDFILEINFO 를 얻어 버전 정보를 확인할 수 있다.
버전 확인 외에 다른 용도는 없는 것 같기도 하고...
버전만 확인할 때 쓰면 되겠다.