정리

'VerQueryValue'에 해당되는 글 2건

  1. [Win32 API] File Version 확인
  2. [Win32 API] File Information 확인 (1)

[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 Information 확인 (1)

저장소/VC++
파일 정보를 확인해야 할 일이 얼마나 있을까?
그나마 많이 확인하는 것이 Attribute나 Size, Version 이정도?
혹시나 필요할 일이 생길까 싶어서 정리한다.

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

#include 


typedef struct _Lang_And_Code_Page
{
	WORD	wLanguage;
	WORD	wCodePage;
}
LANGANDCODEPAGE, *LPLANGANDCODEPAGE;


int GetFileInformation(LPCTSTR _lpszFilePath, LPCTSTR _lpszInfoString, LPTSTR _lpszBuf, DWORD _cchBuf)
{
	if( NULL == _lpszFilePath	||
		NULL == _lpszInfoString	||
		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;
	}

	UINT uLangCodePage = 0;
	LPLANGANDCODEPAGE pLangCodePage = NULL;

	if(FALSE == ::VerQueryValue(pBlockData, _T("\\VarFileInfo\\Translation"), (LPVOID*)&pLangCodePage, &uLangCodePage))
	{
		delete [] pBlockData;

		return -1;
	}

	//
	int nRet = 0;
	TCHAR szResource[50] = {0,};
	TCHAR* pszBuffer = NULL;
	UINT uBufSize = 0;

	for(UINT i = 0 ; i < (uLangCodePage / sizeof(LANGANDCODEPAGE)) ; i++ )
	{
		StringCchPrintf(szResource, 50, _T("\\StringFileInfo\\%04x%04x\\%s"), pLangCodePage[i].wLanguage, pLangCodePage[i].wCodePage, _lpszInfoString);

		if(::VerQueryValue(pBlockData, szResource, (LPVOID*)&pszBuffer, &uBufSize))
			StringCchCopy(_lpszBuf, _cchBuf, pszBuffer);
		else
			nRet = -1;
	}

	delete [] pBlockData;

	return nRet;
}
이렇게 하면 몇몇 정보는 얻어올 수 있지만 파일 등록정보에서 확인할 수 있는 모든 정보를 확인하지는 못한다.
for문과 같은 처리는 파일 정보가 여러 언어로 되어있을 때 확인하기 위해 사용되는건가?
GetFileVersionInfoSizeEx와 GetFileVersionInfoEx에 첫 번째 인자로 Flag를 받게끔 되어있는데 이와 연관되어있을듯 하다.
MSDN을 대충 해석하고 참고해서 만든 것인데 아무래도 설명이 필요할 것 같다.
GetFileVersionInfoSizeEx와 GetFileVersionInfoEx에 대한 내용을 포함해서 나머지 부분은 다음에 다시...