[WinAPI] GetFileVersionInfo 파일 버전 확인

일반적으로 EXE 실행 프로그램에는 파일 버전이 있습니다.
프로그램 개발자들은 파일 버전으로 유지보수를 하거나, 업데이트 작업을 할 수 있습니다.

우선 간단하게 파일 버전을 확인하는 방법을 알아보겠습니다
보통 C:\Program Files (x86)\Kakao\KakaoTalk 경로에 카카오톡 실행 파일이 있습니다. 
해당 파일을 우클릭하여 속성 -> 자세히를 보시면 파일 버전이 적혀있습니다.

이제 코드를 작성하여 파일 버전을 읽어봅시다.
필요 헤더 파일은 아래와 같습니다.

#include <winver.h>

함수 원형은 아래와 같습니다.

// 성공시 FALSE이 아닌 값, 실패 시 FALSE 리턴
BOOL GetFileVersionInfo(
  LPCSTR lptstrFilename, // 파일 전체 경로
  DWORD  dwHandle, // 무시되는 매개변수
  DWORD  dwLen, // lpData의 버퍼 크기
  LPVOID lpData // 파일 정보를 받는 버퍼 포인터, 이후 VerQueryValue 함수를 사용합니다.
);

lpData를 통해 파일 정보를 받게 되면, VerQueryValue 함수를 사용해야 합니다.
전체 코드는 아래와 같습니다.

#include <atlstr.h>
#include <Windows.h>
#pragma comment(lib,"version.lib")

void main(void)
{
	// 버전 확인할 파일 경로(전체 경로)
	CString strFilePath = _T( "C:\\Program Files (x86)\\Kakao\\KakaoTalk\\KakaoTalk.exe" );

	// 파일 정보 저장 버퍼
	TCHAR atcBuffer[MAX_PATH] = { 0, };
	if ( FALSE != GetFileVersionInfo( strFilePath, 0, MAX_PATH, atcBuffer ) )
	{
		VS_FIXEDFILEINFO* pFineInfo = NULL;
		UINT bufLen = 0;
		// VS_FIXEDFILEINFO 정보 가져오기
		if ( FALSE != VerQueryValue( atcBuffer, _T("\\"), (LPVOID*)&pFineInfo, &bufLen ))
		{
			WORD majorVer, minorVer, buildNum, revisionNum;
			majorVer = HIWORD( pFineInfo->dwFileVersionMS );
			minorVer = LOWORD( pFineInfo->dwFileVersionMS );
			buildNum = HIWORD( pFineInfo->dwFileVersionLS );
			revisionNum = LOWORD( pFineInfo->dwFileVersionLS );

			// 파일버전 출력
			printf( "version : %d,%d,%d,%d\n", majorVer, minorVer, buildNum, revisionNum );
 		}
	}

	return;
}

실행 결과는 아래와 같습니다.

위의 카카오톡 파일 버전과 동일한 값이 출력되는 것을 볼 수 있습니다.