標籤:
之前在msdn上Version Information看到檔案版本資訊的介紹,看著整體比較複雜,就一直沒做。現在需要擷取ocx檔案的版本號碼,所以尋找了下相關資料,比較有用的就是VS_FIXEDFILEINFO結構,擷取這個參數就基本可以完成任務了。
代碼如下:
1 //typedef struct tagVS_FIXEDFILEINFO 2 //{ 3 // DWORD dwSignature; /* e.g. 0xfeef04bd */ 4 // DWORD dwStrucVersion; /* e.g. 0x00000042 = "0.42" */ 5 // DWORD dwFileVersionMS; /* e.g. 0x00030075 = "3.75" */ 6 // DWORD dwFileVersionLS; /* e.g. 0x00000031 = "0.31" */ 7 // DWORD dwProductVersionMS; /* e.g. 0x00030010 = "3.10" */ 8 // DWORD dwProductVersionLS; /* e.g. 0x00000031 = "0.31" */ 9 // DWORD dwFileFlagsMask; /* = 0x3F for version "0.42" */10 // DWORD dwFileFlags; /* e.g. VFF_DEBUG | VFF_PRERELEASE */11 // DWORD dwFileOS; /* e.g. VOS_DOS_WINDOWS16 */12 // DWORD dwFileType; /* e.g. VFT_DRIVER */13 // DWORD dwFileSubtype; /* e.g. VFT2_DRV_KEYBOARD */14 // DWORD dwFileDateMS; /* e.g. 0 */15 // DWORD dwFileDateLS; /* e.g. 0 */16 //} VS_FIXEDFILEINFO;17 {18 char szAppFullPath[_MAX_PATH] = {0};19 20 GetModuleFileName(NULL,szAppFullPath,MAX_PATH);//得到程式模組名稱,全路徑21 22 //擷取當前檔案的版本資訊23 DWORD dwLen = GetFileVersionInfoSize(szAppFullPath,NULL); 24 char *pszAppVersion = new char[dwLen+1];25 if(pszAppVersion)26 {27 memset(pszAppVersion,0,sizeof(char)*(dwLen+1));28 GetFileVersionInfo(szAppFullPath,NULL,dwLen,pszAppVersion);29 CString strVersion;30 UINT nLen(0);31 VS_FIXEDFILEINFO *pFileInfo(NULL);32 VerQueryValue(pszAppVersion,"\\",(LPVOID*)&pFileInfo,&nLen);33 if(pFileInfo)34 {35 //擷取檔案版本號碼36 strVersion.Format("%d.%d.%d.%d",HIWORD(pFileInfo->dwFileVersionMS),37 LOWORD(pFileInfo->dwFileVersionMS),38 HIWORD(pFileInfo->dwFileVersionLS),39 LOWORD(pFileInfo->dwFileVersionLS));40 }41 }42 }
基本思路就是先擷取可執行檔所在的全路徑,然後使用GetFileVersionInfo函數,擷取版本資訊;之後使用VerQueryValue函數,查詢版本資訊。
擷取windows可執行檔的version資訊(版本號碼)