정리

'File Version'에 해당되는 글 2건

  1. [Win32 API] File Version 확인
  2. [Win32 API] File Version

[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 를 얻어 버전 정보를 확인할 수 있다.
버전 확인 외에 다른 용도는 없는 것 같기도 하고...
버전만 확인할 때 쓰면 되겠다.

[Win32 API] File Version

저장소/VC++
DLL 또는 EXE의 File Version을 확인하는데는 3가지 API를 사용합니다.

1. DWORD GetFileVersionInfoSize(LPCTSTR lptstrFileName, LPDWORD lpdwHandle)
2. BOOL GetFileVersionInfo(LPCTSTR lptstrFileName, DWORD dwHandle, DWORD dwLen, LPVOID lpData)
3. BOOL VerQueryValue(LPCVOID pBlock, LPCTSTR lpSubBlock, LPVOID* lplpBuffer, PUINT puLen)

그리고 VS_FIXEDFILEINFO 구조체가 필요하군요.

struct VS_FIXEDFILEINFO {
DWORD dwSignature,
DWORD dwStructVersion,
DWORD dwFileVersionMS,
DWORD dwFileVersionLS,
DWORD dwProductVersionMS,
DWORD dwProductVersionLS,
DWORD dwFileFlagMask,
DWORD dwFileFlags,
DWORD dwFileOS,
DWORD dwFileType,
DWORD dwFileSubType,
DWORD dwFileDateMS,
DWORD dwFileDateLS
};

MSDN을 살펴보면 참 복잡합니다. 몇년을 봐도 복잡하네요. 영어가 싫을 뿐입니다.

예제로 살펴봅니다.

#include <Windows.h>
#include <WinVer.h>

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

int _tmain(int argc, _TCHAR* argv[])
{
TCHAR* pszDestFilePath = _T("d:\\test.exe");

DWORD dwHandle = 0;
DWORD dwSize = 0;

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

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

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

return 1;
}

VS_FIXEDFILEINFO* pVerInfo = NULL;
UINT uLen = 0;

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

return 1;
}

_tprintf_s(_T("Major Version : %d\n"), HIWORD(pVerInfo->dwFileVersionMS));
_tprintf_s(_T("Minor Version : %d\n"), LOWORD(pVerInfo->dwFileVersionMS));
_tprintf_s(_T("Release Version : %d\n"), HIWORD(pVerInfo->dwFileVersionLS));
_tprintf_s(_T("Test Version : %d\n"), LOWORD(pVerInfo->dwFileVersionLS));

delete [] pBlockData;

return 0;
}

아~ 잘 돌아가는군요. 이렇게 확인하면 되겠습니다.
더 붙이거나 뺄 것은 없는 것 같네요.
보다 자세한 사항은 MSDN을 보도록 합니다.

'저장소 > VC++' 카테고리의 다른 글

[Win32 API] Registry Element Size Limits  (0) 2010.12.16
[Win32 API] RegEnumKeyEx  (0) 2010.12.16
[Win32 API] System Information Functions  (0) 2010.07.16
[Win32 API] Verifying the System Version  (0) 2010.07.16
[Win32 API] Windows OS Version  (0) 2010.07.16