2011年5月26日 星期四

GetFileVersion

利用GetFileVersionInfoSize, GetFileVersionInfo, VerQueryValue這三個API來取得檔案的Version資訊

首先取得執行程式的位置
// get the app path
    TCHAR apppath[MAX_PATH]={0};
    GetModuleFileName(AfxGetInstanceHandle(),apppath,MAX_PATH-1);
    CString csAppPath(apppath);
    int nPos = csAppPath.ReverseFind('\\');
    csAppPath = csAppPath.Left(nPos + 1);
    csAppPath += _T("my.exe");
  
取得版本資訊
  // get version
    DWORD dwLen = 0;
    TCHAR* lpData=NULL;
    BOOL bSuccess = FALSE;
    dwLen = GetFileVersionInfoSize(csAppPath, 0);

   if (0 == dwLen)
    {
      return ;
    }

    lpData =new TCHAR [dwLen+1];

    GetFileVersionInfo(csAppPath, 0, dwLen, lpData);
   
    LPVOID lpBuffer = NULL;
    UINT uLen = 0;

   VerQueryValue(lpData,
              _T("\\StringFileInfo\\040904b0\\FileVersion"),
//040904b0 can be found in resource view->version-> blockheader
             
     /*  properties for query  可以查詢的資訊
    CompanyName
    FileDescription
    FileVersion
    InternalName
    LegalCopyright
    OriginalFilename
    ProductName
    ProductVersion
    Comments
    LegalTrademarks
    PrivateBuild
    SpecialBuild
     */            
              &lpBuffer,
              &uLen);
   
// lpBuffer存有查詢回來的資訊。

   CString csVersion;
   csVersion.Format(_T("%s"),(TCHAR*)lpBuffer);

   m_csVersion += csVersion;
 
delete [] lpData;
// lpBuffer可以不用delete,因為他指向和lpData相同的記憶體空間

沒有留言:

張貼留言