BLOG ARTICLE 실행파일 | 1 ARTICLE FOUND

  1. 2006/08/24 MFC - 실행파일에 포함된 버전 정보 얻기

출처 : http://blog.naver.com/seamusic00/130002285791

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 는 아래와 같다.
DWORD GetFileVersionInfoSize(
  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
);


파일 정보를 가져오는 예제이다.

// This function gets the file version info structure
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" 와 유사하게 표시되고 있음.

VS_FIXEDFILEINFO Info;
WORD wVer1 = HIWORD(Info.dwFileVersionMS);
WORD wVer2 = LOWORD(Info.dwFileVersionMS);
WORD wVer3 = HIWORD(Info.dwFileVersionLS);
WORD wVer4 = LOWORD(Info.dwFileVersionLS);


이올린에 북마크하기(0) 이올린에 추천하기(0)