m_strVersion = m_strVersion + _T(Information(szFileName, "FileVersion"));
char* CAboutDlg::Information(char *szFileName, char* szQuery)
{
if(szQuery == "")
return "";
DWORD dwHandle;
LPVOID ptr;
UINT uLength;
DWORD dwVersionInfoSize = GetFileVersionInfoSize(szFileName, &dwHandle);
if(dwVersionInfoSize == 0)
return "";
LPVOID pFileInfo = (LPVOID) HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, dwVersionInfoSize);
GetFileVersionInfo(szFileName, dwHandle, dwVersionInfoSize, pFileInfo);
VerQueryValue(pFileInfo, TEXT("\\VarFileInfo\\Translation"), &ptr, &uLength);
WORD *id = (WORD*) ptr;
char szString[255];
sprintf(szString, "\\StringFileInfo\\%04X%04X\\%s", id[0], id[1], szQuery);
VerQueryValue(pFileInfo, szString, &ptr, &uLength);
if(uLength == 0)
return "";
char sOut[255];
memset(sOut, 0x00, 255);
strcpy(sOut, (char *) ptr);
HeapFree(GetProcessHeap(), 0, pFileInfo);
return sOut;
}
===========================================================
로컬 윈도우의 실행되고있는 파일의 버전을 가져오는 방법인다.
szFileName 에 실행 파일의 전체 경로를 써 놓으면 된다.
GetFileVersionInfoSize
This function determines whether the operating system can obtain version information about a specified file. If version information is available, GetFileVersionInfoSize returns the size, in bytes, of that information.
GetFileVersionInfo
This function returns version information about a specified file.
VerQueryValue
This function returns selected version information from the specified version-information resource. To retrieve the appropriate resource, before you call VerQueryValue, you must first call the GetFileVersionInfoSize function, and then the GetFileVersionInfo function.
출처 : http://www.antegg.com/phpBB2/viewtopic.php?p=9&sid=4c1b99361b3b4f002c058b9c72731e0b
리소스에 보면 Version 항목에 VS_VERSION_INFO 라는게 있다. 이 정보를 알아내면 편리한 경우가 몇가지 있는데, DLL 의 버전을 확인 할 때나 about 다이알로그 등에 버전을 출력시 등등에 응용이 가능하다.
이 정보를 접근시 활용 API 는 아래와 같다.
LPTSTR lptstrFilename, // file name
LPDWORD lpdwHandle // set to zero
);
BOOL GetFileVersionInfo(
LPTSTR lptstrFilename, // file name
DWORD dwHandle, // ignored
DWORD dwLen, // size of buffer
LPVOID lpData // version information buffer
);
BOOL VerQueryValue(
const LPVOID pBlock, // buffer for version resource
LPTSTR lpSubBlock, // value to retrieve
LPVOID *lplpBuffer, // buffer for version value pointer
PUINT puLen // version length
);
파일 정보를 가져오는 예제이다.
BOOL GetFileVersion (char *filename, VS_FIXEDFILEINFO *pvsf)
{
DWORD dwHandle;
DWORD cchver = GetFileVersionInfoSize(filename, &dwHandle);
if (cchver == 0) return FALSE;
char* pver = new char[cchver];
BOOL bret = GetFileVersionInfo(filename, dwHandle, cchver, pver);
if (!bret) return FALSE;
UINT uLen;
void *pbuf;
bret = VerQueryValue(pver, "\\", &pbuf, &uLen);
if (!bret) return FALSE;
memcpy(pvsf,pbuf,sizeof(VS_FIXEDFILEINFO));
delete[] pver;
return TRUE;
}
파일 정보의 경우는 아래와 같이 해석하면 된다. 보통 "1,0,0,1" 와 유사하게 표시되고 있음.
WORD wVer1 = HIWORD(Info.dwFileVersionMS);
WORD wVer2 = LOWORD(Info.dwFileVersionMS);
WORD wVer3 = HIWORD(Info.dwFileVersionLS);
WORD wVer4 = LOWORD(Info.dwFileVersionLS);


이올린에 북마크하기
이올린에 추천하기




