자신이 만든 프로그램의 버전 정보나
다른 프로그램의 버전 정보를 얻어오는 클래스입니다.
빌더용 클래스가 없는 것 같아, 공개된 몇 분의 소스를 참조해 간단히 만들었습니다.
// 프로그램의 버전정보 얻기
//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");
}
그럼.