본문 바로가기

2.분석 및 설계

프로그램 버전 얻기

파일 버전을 얻는 프로그램이다.

작성일: 2009.04.13 (http://ospace.tistory.com/), ospace114@엠팔.컴

사용법은 다음과 같다.

// 현재 수행되는 프로그램이나 DLL 의 정보
CFileVersion fv;
if(!fv.update()) {
    // error
}
cout << "version: " << fv.getVersion() << endl;
cout << "Major: " << fv.getMajor() <<", " << fv.getMinor() << endl;

다음은 다른 예제이다.

// 특정 위치의 파일에 대한 버전 정보
CFileVersion fv(".../foo.exe");
if(!fv.update()) {
    // error
}
cout << "version: " << fv.getVersion() << endl;
cout << "Major: " << fv.getMajor() <<", " << fv.getMinor() << endl;

이상이다. 이외에 다른 정보를 추가로 더 추출할 수 있지만, 자세한 것은 MSDN등을 참고하세요.

에러 처리부분은 단순하게 했으니 세부적인 에러 처리하기 위해서는 수정이 필요할 것이다.

헤더파일

// FileVersion.h
#pragma once
#include <string>
#pragma comment (lib, "version.lib")
class CFileVersion{
private:
    DWORD verMajor;    DWORD verMinor;    DWORD verBuild;    DWORD verRevision;
    std::string filePath;
protected:
    std::string currentPath(void);
public:
    CFileVersion(const std::string& path = "");
    ~CFileVersion(void);
    BOOL update();
    std::string getVersion(void);
    DWORD getMajor(void)    {        return verMajor;    }
    DWORD getMinor(void)    {        return verMinor;    }
    DWORD getBuild(void)    {        return verBuild;    }
    DWORD getRevision(void)    {        return verRevision;    }
};

소스파일

// FileVersion.cpp
#include "fileversion.h"
#include <sstream>
CFileVersion::CFileVersion(const std::string& path):
verMajor(0),
verMinor(0),
verBuild(0),
verRevision(0),
filePath(path){}

CFileVersion::~CFileVersion(void){}

std::string CFileVersion::getVersion(void){
    std::string tmp;
    std::ostringstream ostm;
    ostm << verMajor << "." << verMinor << "." << verBuild << "." << verRevision;
    return ostm.str();
}

BOOL CFileVersion::update(){
    std::string path;
    if(filePath.empty()) {
        path = currentPath();
    } else {
        path = filePath;
    }
    DWORD sizeVer = GetFileVersionInfoSize(path.c_str(), NULL);
    if(sizeVer < 0) {
        return false;
    }
    char *pver = new char[sizeVer];
    if (!GetFileVersionInfo(path.c_str(), NULL, sizeVer, pver)) {
        return false;
    }
    VS_FIXEDFILEINFO *pfi;
    UINT len;
    if(!VerQueryValue(pver, _T("\\"), (LPVOID*)&pfi, &len)) {
        delete[] pver;
        return false;
    }
    verMajor = HIWORD(pfi->dwFileVersionMS);
    verMinor = LOWORD(pfi->dwFileVersionMS);
    verBuild = HIWORD(pfi->dwFileVersionLS);
    verRevision = LOWORD(pfi->dwFileVersionLS);
    delete[]  pver;
    return true;
}

std::string CFileVersion::currentPath(void){
    TCHAR path[512];
    DWORD n = GetModuleFileName(NULL, path, 512);
    path[n] = TEXT('\0');
    return path;
}
반응형

'2.분석 및 설계' 카테고리의 다른 글

함수 호출과정 분석  (0) 2011.01.12
코드 문서화  (0) 2011.01.07
설치 패키지 작성시 고려사항  (0) 2009.07.31
[Flash] Related of Flash Movie  (0) 2007.05.21
OOD(객체지향 개발)의 원칙  (0) 2006.11.13