C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 팁&트릭
C++Builder Programming Tip&Tricks
[994] 파일의 버전정보 얻어오는 클래스.
김태선 [cppbuilder] 9911 읽음    2010-07-12 15:27
자신이 만든 프로그램의 버전 정보나
다른 프로그램의 버전 정보를 얻어오는 클래스입니다.
빌더용 클래스가 없는 것 같아, 공개된 몇 분의 소스를 참조해 간단히 만들었습니다.

// 프로그램의 버전정보 얻기

//typedef struct tagVS_FIXEDFILEINFO
//{
//	DWORD   dwSignature;            /* e.g. 0xfeef04bd */
//	DWORD   dwStrucVersion;         /* e.g. 0x00000042 = "0.42" */
//	DWORD   dwFileVersionMS;        /* e.g. 0x00030075 = "3.75" */
//	DWORD   dwFileVersionLS;        /* e.g. 0x00000031 = "0.31" */
//	DWORD   dwProductVersionMS;     /* e.g. 0x00030010 = "3.10" */
//	DWORD   dwProductVersionLS;     /* e.g. 0x00000031 = "0.31" */
//	DWORD   dwFileFlagsMask;        /* = 0x3F for version "0.42" */
//	DWORD   dwFileFlags;            /* e.g. VFF_DEBUG | VFF_PRERELEASE */
//	DWORD   dwFileOS;               /* e.g. VOS_DOS_WINDOWS16 */
//	DWORD   dwFileType;             /* e.g. VFT_DRIVER */
//	DWORD   dwFileSubtype;          /* e.g. VFT2_DRV_KEYBOARD */
//	DWORD   dwFileDateMS;           /* e.g. 0 */
//	DWORD   dwFileDateLS;           /* e.g. 0 */
//} VS_FIXEDFILEINFO;

class TVersionInfo
{
private:
	// 자신의 버전정보 읽어 들이기.
	//
	void ReadVersion()
	{
		HRSRC hVersion = FindResource(HInstance, MAKEINTRESOURCE(VS_VERSION_INFO), RT_VERSION );
		if (hVersion)
		{
			HGLOBAL hResVersion = LoadResource(HInstance, hVersion);
			if (hResVersion)
			{
				void *pVersionInfo = LockResource(hResVersion);
				if (pVersionInfo)
				{
					WORD InfoSize;
					memmove(&InfoSize, pVersionInfo, sizeof(WORD));

					byte *pVersionData = new byte[InfoSize];
					memmove(pVersionData, pVersionInfo, InfoSize);

					void *pFixedFileInfo;
					UINT Len = 0;
					VerQueryValue(pVersionData, "\\", &pFixedFileInfo, &Len);
					memmove(&Data, pFixedFileInfo, sizeof(VS_FIXEDFILEINFO));
					delete[] pVersionData;
				}
			}
			UnlockResource(hResVersion);
			FreeResource(hResVersion);
		}
	}
	WORD GetMajor()
	{
		return HIWORD(Data.dwProductVersionMS);
	}
	WORD GetMinor()
	{
		return LOWORD(Data.dwProductVersionMS);
	}
	WORD GetRelease()
	{
		return HIWORD(Data.dwProductVersionLS);
	}
	WORD GetBuild()
	{
		return LOWORD(Data.dwProductVersionLS);
	}

public:
	VS_FIXEDFILEINFO	Data;
	__property  WORD Build   = { read=GetBuild };
	__property  WORD Major   = { read=GetMajor };
	__property  WORD Minor   = { read=GetMinor };
	__property  WORD Release = { read=GetRelease };

public:
	TVersionInfo()
	{
		ZeroMemory(this, sizeof(*this));
		ReadVersion();
	}
	String VersionString()
	{
		return String().sprintf("%u.%u.%u.%u", Major, Minor, Release, Build) ;
	}

	// 지정한 파일의 버전정보를 얻어 온다.
	/*  query List
		- CompanyName
		- FileDescription
		- FileVersion
		- InternalName
		- LegalCopyright
		- LegalTrademarks
		- ProductName
		- ProductVersion
	*/
	static String 	GetFileVersionInfomation(String filename, String query)
	{
		if (query.IsEmpty())
			return "";

		DWORD dwHandle;
		DWORD dwVersionInfoSize = GetFileVersionInfoSize(filename.c_str(), &dwHandle);
		if (dwVersionInfoSize == 0)
			return "";

		void *pFileInfo = (void*) HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, dwVersionInfoSize);

		GetFileVersionInfo(filename.c_str(), dwHandle, dwVersionInfoSize, pFileInfo);
		void *ptr;
		UINT uLength;
		VerQueryValue(pFileInfo, TEXT("\\VarFileInfo\\Translation"), &ptr, &uLength);

		WORD *id = (WORD*) ptr;
		String str = "\\StringFileInfo\\" + IntToHex(id[0], 4) + IntToHex(id[1], 4) + "\\" + query;

		VerQueryValue(pFileInfo, str.c_str(), &ptr, &uLength);
		if (uLength == 0)
			return "";

		String info = (char *)ptr;
		HeapFree(GetProcessHeap(), 0, pFileInfo);

		return info;
	}
};


사용법은 소스 보시는 즉시 아실만 한데,
간단히 말하자면
자기 버전정보는
{
    TVersionInfo VersionInfo;

    Caption = VersionInfo.VersionString();
}

다른 프로그램의 버전 관련 정보는
{
    Caption = TVersionInfo::GetFileVersionInfomation("Project1.exe", "CompanyName");
}

그럼.
장성호 [nasilso]   2010-07-12 15:33 X
좋네요..

+ -

관련 글 리스트
994 파일의 버전정보 얻어오는 클래스. 김태선 9911 2010/07/12
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.