#include "stdafx.h"
#include <nlite_common\nexception.h>
#include "appinfo.h"

#include "namespace_start.h"



	CApplicationInfo CApplicationInfo::APPINFO;

	CApplicationInfo::CApplicationInfo(){


		

		struct LANGANDCODEPAGE {

			WORD  wLanguage;
			WORD wCodePage;
		} *lpTranslate;
		TCHAR szModuleName[_MAX_PATH + 1] = {0};										//アプリケーションファイル名
		

		DWORD dwReserved;															//ファイル情報格納用
		LPTSTR errMessage = NULL;													//エラー発生したメッセージ

		//アプリケーションファイル名取得
		int nRet = GetModuleFileName(NULL,szModuleName,ARRAYSIZE(szModuleName));	

		if(nRet <= 0){

			throw Exception(_T("アプリケーション情報取得に失敗しました"),__LINE__,TEXT(__FILE__),TEXT(__FUNCTION__));
		}
			
		//アプリケーションバージョン情報のサイズ取得
		DWORD dwSize = GetFileVersionInfoSize(szModuleName,&dwReserved);

		if(dwSize <= 0){

			throw Exception(_T("アプリケーション情報取得に失敗しました"),__LINE__,TEXT(__FILE__),TEXT(__FUNCTION__));
		}

		block.resize(dwSize);
		

		if(block.empty()){

			throw Exception(_T("アプリケーション情報取得に失敗しました"),__LINE__,TEXT(__FILE__),TEXT(__FUNCTION__));
		}
		//
		//アプリケーションバージョン情報取得
		//
		BOOL bRet = GetFileVersionInfo(szModuleName,0,dwSize,&block[0]);

		if(bRet != TRUE){
			throw Exception(_T("アプリケーション情報取得に失敗しました"),__LINE__,TEXT(__FILE__),TEXT(__FUNCTION__));
		}


		UINT ulen;
		if(VerQueryValue(&block[0],TEXT("\\VarFileInfo\\Translation"),(LPVOID*)&lpTranslate,&ulen) == FALSE){
			throw Exception(_T("アプリケーション情報取得に失敗しました"),__LINE__,TEXT(__FILE__),TEXT(__FUNCTION__));
		}

		TCHAR subBlock[_MAX_PATH];
		_stprintf(subBlock,TEXT("\\StringFileInfo\\%04x%04x\\ProductVersion"),lpTranslate->wLanguage,lpTranslate->wCodePage);

		if(VerQueryValue(&block[0],subBlock,(LPVOID *)&pProductVersion,&ulen) == FALSE){

			throw Exception(_T("アプリケーション情報取得に失敗しました"),__LINE__,TEXT(__FILE__),TEXT(__FUNCTION__));

		}

		_stprintf(subBlock,TEXT("\\StringFileInfo\\%04x%04x\\OriginalFilename"),lpTranslate->wLanguage,lpTranslate->wCodePage);

		if(VerQueryValue(&block[0],subBlock,(LPVOID *)&pOriginalFileName,&ulen) == FALSE){

			throw Exception(_T("アプリケーション情報取得に失敗しました"),__LINE__,TEXT(__FILE__),TEXT(__FUNCTION__));

		}

		_stprintf(subBlock,TEXT("\\StringFileInfo\\%04x%04x\\LegalCopyright"),lpTranslate->wLanguage,lpTranslate->wCodePage);

		if(VerQueryValue(&block[0],subBlock,(LPVOID *)&pLegalCopyright,&ulen) == FALSE){

			throw Exception(_T("アプリケーション情報取得に失敗しました"),__LINE__,TEXT(__FILE__),TEXT(__FUNCTION__));

		}

		_stprintf(subBlock,TEXT("\\StringFileInfo\\%04x%04x\\ProductName"),lpTranslate->wLanguage,lpTranslate->wCodePage);

		if(VerQueryValue(&block[0],subBlock,(LPVOID *)&pProductName,&ulen) == FALSE){

			throw Exception(_T("アプリケーション情報取得に失敗しました"),__LINE__,TEXT(__FILE__),TEXT(__FUNCTION__));

		}


		

		return;



	}


	CApplicationInfo::~CApplicationInfo(){


		
	}

	


	const LPCTSTR CApplicationInfo::getProductVersion(){

		return APPINFO.pProductVersion;

	}

	const LPCTSTR  CApplicationInfo::getOriginalFileName(){

		return APPINFO.pOriginalFileName;

	}

	const LPCTSTR  CApplicationInfo::getLegalCopyright(){

		return APPINFO.pLegalCopyright;

	}

	const LPCTSTR  CApplicationInfo::getProcuctName() {

		return APPINFO.pProductName;
	}



#include "namespace_end.h"