Right now do !

[VC++] 리소스에 정의된 버전 정보 읽기 함수

by 지금당장해

 요즘은 대부분의 Application을 .NET으로 만들다보니 VC++를 사용하는 경우는 COM (ActiveX)모듈을 작성하는 경우가 많다. 왠 철지난 COM이냐고 하겠지만 다양한 환경의 이기종 개발툴들과 Interface할일이 많다보니 적어도 나는 그렇다. 헌데 언제 부턴가 리소스에 버전을 정의 해놓고 이와 별도로 버전을 리턴하는 함수에서 하드 코드하여 리턴하고 있지 않은가? 파일 버전을 리소스에서 올릴때마다 이를 다시 신경 써서 수정 해야만 했다.  이를 놓치고 잘못 배포 한 후에 리소스에서 정보를 읽는 방법을 찾기 시작 했다. 어디선가 배껴온 코드긴 한데 ... 


[VS에서 열어본 OOO.rc 파일]



[리소스에서 파일 버전 읽기 코드]

CString CA::GetVersionInVsVersionInfo()
{
	CString strVersion;
	TCHAR temp_path[MAX_PATH];
	GetModuleFileName(AfxGetInstanceHandle(), temp_path, sizeof(temp_path));


	DWORD h_version_handle;
	DWORD version_info_size = GetFileVersionInfoSize(temp_path, &h_version_handle);

	HANDLE h_memory = GlobalAlloc(GMEM_MOVEABLE, version_info_size);
	LPVOID p_info_memory = GlobalLock(h_memory);

	GetFileVersionInfo(temp_path, h_version_handle, version_info_size, p_info_memory);


	TCHAR *p_data = NULL;
	UINT data_size = 0;

	if (VerQueryValue(p_info_memory, _T("\\StringFileInfo\\041204b0\\FileVersion"), (void **)&p_data, &data_size)) 
	{
		strVersion = CString(p_data);
	}

	GlobalUnlock(h_memory);
	GlobalFree(h_memory);

	return strVersion;
}

[GetFileVersionSize등의 API에 접근 하기위한 Version.lib 링크]



VC++을 자주 사용하지 않는 관계로 자꾸 잊어 버리는데 ... 위 설정은 Debug/Release를 별도로 설정 해줘야 한다.

블로그의 정보

지금 당장 해!!!

지금당장해

활동하기