最新消息

[公告2014/05/30] 如有需要將部落格中,任何一篇文章的程式碼使用在商業用途,請與我聯繫。

[公告2015/04/26] Line版的 iInfo程式與投資應用 群組已上線想加入的朋友們,請先查看 "入群須知" 再與我聯繫 Line : aminwhite5168,加入請告知身分與回答 "入群須知" 的問題。

[公告2018/04/22] 台北 Python + Excel VBA 金融資訊爬蟲課程,課程如網頁內容 金融資訊爬蟲班:台北班 Python 金融資訊爬蟲、EXCEL VBA 金融資訊爬蟲

[公告2019/01/08] 請注意:我再次重申,部落格文章的程式碼,是要提供各位參考與學習,一旦網頁改版請自行修改,別要求東要求西要我主動修改,你們用我寫東西賺錢了、交差了,請問有分我一杯羹嗎?既然賺錢沒分我,請問有什麼理由要求我修改,如果沒能力改,就花錢來找我上課。

[公告2019/12/01] 若各位有 Excel VBA 案子開發需求,歡迎與我聯繫,可接案處理。

[公告2020/05/22] 頁面載入速度慢,起因為部分JS來源(alexgorbatchev.com)失效導致頁面載入變慢,目前已做調整,請多見諒。

2013年4月17日 星期三

使用GetFileVersionInfo來取得程式的版本資訊

延續前一篇使用VC6與VC2010在Resource欄位的差異,透過GetFileVersionInfo來取得程式中,有關版本資訊,就可以比較出VC6與VC2010在Resource檔的差異。
*.CPP程式碼。
BOOL GetFileVersion()
{
 char cPath[MAX_PATH], cSubBlock[MAX_PATH];
 DWORD dwHandle, dwInfoSize, dwTrans;
 UINT uTranslate = 0, uBytes = 0;
 DWORD *dwTranslation = NULL;
 CHAR *cpBuffer = NULL;

 //Find file module path
 if(!GetModuleFileName(AfxGetInstanceHandle(), cPath, sizeof(cPath)))
 {
  printf("ERROR : Can't find resource version table path.\n");
  return FALSE;
 }

 //Get file version size 
 dwInfoSize = GetFileVersionInfoSize(cPath, &dwHandle);
 if(dwInfoSize == 0)
 {
  printf("ERROR : The file resource version size is error.\n");
  return FALSE;
 }

 //Allocate buffer and retrieve version information 
 char *cpInfoBuf = new char[dwInfoSize];
 if(!cpInfoBuf)
 {
  return FALSE;
 }

 if(!GetFileVersionInfo(cPath, 0, dwInfoSize, cpInfoBuf))
 {
  delete [] cpInfoBuf;
  return FALSE;
 }   

 //Get the language setting first 
 if(!VerQueryValue(cpInfoBuf, _TEXT("\\VarFileInfo\\Translation"), (LPVOID*)&dwTranslation, &uTranslate))
 {
  delete [] cpInfoBuf;
  return FALSE;
 }

 if(*dwTranslation == NULL)
 {
  delete [] cpInfoBuf;
  return FALSE;
 }

 dwTrans = MAKELONG(HIWORD (dwTranslation[0]), LOWORD (dwTranslation[0]));
 // Read the file description for each language and code page.
 CHAR *szpVersion[] = { "CompanyName", 
       "FileVersion",
       "LegalCopyright",
       "PrivateBuild", 
       "Comments",
       "InternalName",
       "ProductName",
       "ProductVersion",
       "FileDescription",
       "LegalTrademarks",
       "OriginalFilename",
       "SpecialBuild" };


 for (int i = 0 ; i < VERSIONCOUNT ; i++)
 {
  sprintf( cSubBlock, _TEXT("\\StringFileInfo\\%08lx\\%s"), dwTrans, szpVersion[i]); 
  if (!VerQueryValue(cpInfoBuf, cSubBlock, (LPVOID* )&cpBuffer, &uBytes))
  {
   //printf("Warning : The file is no version information.\n");
   //return FALSE;
   m_csRCVersionInfo[i] = "";
   continue;
  }
  m_csRCVersionInfo[i] = cpBuffer;
 }  

 delete [] cpInfoBuf;
 dwTranslation = NULL;
 cpBuffer = NULL;

 return TRUE;
}
*.h程式碼。
#pragma  comment(lib, "VERSION.LIB")

enum { 
 COMPANYNAME,
 FILESVERSION,
 LEGALCOPYRIGHT,
 PRIVATEBUILD,
 COMMENTS,
 INTERNALNAME,
 PRODUCTNAME,
 PRODUCTSVERSION,
 FILEDESCRIPTION,
 LEGALTRADEMARKS,
 ORIGINALFILENAME,
 SPECIALBUILD,
 VERSIONCOUNT
};

CString m_csRCVersionInfo[12];