《Windows API巡禮》—GetFileVersionInfo函數和VerQueryValue函數

來源:互聯網
上載者:User

VS_FIXEDFILEINFO結構包含了檔案的版本資訊:

typedef struct tagVS_FIXEDFILEINFO {<br /> DWORD dwSignature; //包含的值是0xFEEF04BD<br /> DWORD dwStrucVersion; //該結構的32位二進位版本號碼,高16位是主要版本號,低16位是副版本號碼<br /> DWORD dwFileVersionMS; //該檔案二進位版本號碼的高32bits<br /> DWORD dwFileVersionLS; //該檔案二進位版本號碼的低32bits<br /> DWORD dwProductVersionMS; //發布該檔案的產品二進位版本號碼高32bits<br /> DWORD dwProductVersionLS; //發布該檔案的產品二進位版本號碼低32bits<br /> DWORD dwFileFlagsMask; //位元掩碼,標誌dwFileFlags的有效位<br /> DWORD dwFileFlags; //VS_FF_DEBUG---該檔案包含調試資訊或是由調試版編譯的<br /> //VS_FF_INFOINFERRED---檔案的版本結構是動態建立的,<br />//因此,該結構中有的成員是空的或不正確的<br /> //VS_FF_PATCHED---該檔案被修改過<br /> //VS_FF_PRERELEASE---該檔案是開發版,不是商業發布版<br /> //VS_FF_PRIVATEBUILD---該檔案不是由標準發布步驟構建的<br /> //VS_FF_SPECIALBUILD---該檔案是由標準發布步驟構建的,<br />//但是相同版本號碼檔案的變種<br /> DWORD dwFileOS; //該檔案設計用於的作業系統<br /> DWORD dwFileType; //檔案類型:VFT_APP---檔案包含一個應用程式<br /> VFT_DLL---檔案包含一個DLL<br /> VFT_DRV---檔案包含一個裝置驅動<br /> VFT_FONT---檔案包含一個字型檔<br /> VFT_STATIC_LIB---檔案包含一個靜態連結庫<br /> VFT_UNKNOWN---檔案類型未知<br /> VFT_VXD---檔案包含一個虛擬設備<br /> DWORD dwFileSubtype; //檔案的子類型,由dwFileType決定<br /> DWORD dwFileDateMS; //二進位檔案建立日期和時間戳記的高32bits<br /> DWORD dwFileDateLS; //二進位檔案建立日期和時間戳記的低32bits<br />} VS_FIXEDFILEINFO; 

GetFileVersionInfoSize函數用於判斷系統能否檢索到指定檔案的版本資訊,如果可以,函數返回版本資訊的位元組大小:

DWORD WINAPI GetFileVersionInfoSize(<br /> __in LPCTSTR lptstrFilename, //指定檔案的名稱<br /> __out_opt LPDWORD lpdwHandle //一個變數的指標,該函數將該變數設為0<br />); 

GetFileVersionInfo函數用來獲得指定檔案的版本資訊:

BOOL WINAPI GetFileVersionInfo(<br /> __in LPCTSTR lptstrFilename, //檔案名稱<br /> __reserved DWORD dwHandle, //保留值<br /> __in DWORD dwLen, //lpData指向緩衝區的大小,使用函數GetFileVersionInfoSize得到<br /> __out LPVOID lpData //指向存放檔案版本資訊的緩衝區的指標<br />);  

VerQueryValue函數用於從指定的版本資訊源擷取版本資訊,在調用該函數之前,需要先依次調用函數GetFileVersionInfoSize和GetFileVersionInfo:

BOOL WINAPI VerQueryValue(<br /> __in LPCVOID pBlock, //由函數GetFileVersionInfo得到的版本資訊源<br /> __in LPCTSTR lpSubBlock, //“/”表示該函數擷取VS_FIXEDFILEINFO結構資訊<br /> //為“/VarFileInfo/Translation”表示該函數擷取檔案的翻譯表<br /> //為“/StringFileInfo/lang-codepage/string-name”表示該函數擷取檔案的字串資訊<br /> __out LPVOID *lplpBuffer, //返回指向pBlock指向的地址,當pBlock被釋放時,該參數也被釋放<br /> __out PUINT puLen //lplpBuffer指向的資料的位元組大小<br />); 

上面參數lpSubBlock取值中的string-name必須是下面系統預定義的字串之一:

  

下面代碼執行個體封裝了一個檔案版本資訊類,使用上面介紹的函數方便地擷取檔案版本資訊,標頭檔定義如下FileVersion.h: 

// FileVersion.h: interface for the CFileVersion class.<br />// by Manuel Laflamme<br />//////////////////////////////////////////////////////////////////////<br />#ifndef __FILEVERSION_H_<br />#define __FILEVERSION_H_<br />#if _MSC_VER >= 1000<br />#pragma once<br />#endif // _MSC_VER >= 1000<br />class CFileVersion<br />{<br />// Construction<br />public:<br /> CFileVersion();<br />// Operations<br />public:<br /> BOOL Open(LPCTSTR lpszModuleName);<br /> void Close();<br /> CString QueryValue(LPCTSTR lpszValueName, DWORD dwLangCharset = 0);<br /> CString GetFileDescription() {return QueryValue(_T("FileDescription")); };<br /> CString GetFileVersion() {return QueryValue(_T("FileVersion")); };<br /> CString GetInternalName() {return QueryValue(_T("InternalName")); };<br /> CString GetCompanyName() {return QueryValue(_T("CompanyName")); };<br /> CString GetLegalCopyright() {return QueryValue(_T("LegalCopyright")); };<br /> CString GetOriginalFilename() {return QueryValue(_T("OriginalFilename"));};<br /> CString GetProductName() {return QueryValue(_T("ProductName")); };<br /> CString GetProductVersion() {return QueryValue(_T("ProductVersion")); };<br /> BOOL GetFixedInfo(VS_FIXEDFILEINFO& vsffi);<br /> CString GetFixedFileVersion();<br /> CString GetFixedProductVersion();<br />// Attributes<br />protected:<br /> LPBYTE m_lpVersionData;<br /> DWORD m_dwLangCharset;<br />// Implementation<br />public:<br /> ~CFileVersion();<br />};<br />#endif // __FILEVERSION_H_ 

標頭檔的實現如下FileVersion.cpp:

// FileVersion.cpp: implementation of the CFileVersion class.<br />// by Manuel Laflamme<br />//////////////////////////////////////////////////////////////////////<br />#include "FileVersion.h"<br />#pragma comment(lib, "version")<br />#ifdef _DEBUG<br />#undef THIS_FILE<br />static char THIS_FILE[]=__FILE__;<br />#define new DEBUG_NEW<br />#endif<br />//////////////////////////////////////////////////////////////////////<br />CFileVersion::CFileVersion()<br />{<br /> m_lpVersionData = NULL;<br /> m_dwLangCharset = 0;<br />}<br />CFileVersion::~CFileVersion()<br />{<br /> Close();<br />}<br />void CFileVersion::Close()<br />{<br /> delete[] m_lpVersionData;<br /> m_lpVersionData = NULL;<br /> m_dwLangCharset = 0;<br />}<br />BOOL CFileVersion::Open(LPCTSTR lpszModuleName)<br />{<br /> ASSERT(_tcslen(lpszModuleName) > 0);<br /> ASSERT(m_lpVersionData == NULL);<br /> // Get the version information size for allocate the buffer<br /> DWORD dwHandle;<br /> DWORD dwDataSize = ::GetFileVersionInfoSize((LPTSTR)lpszModuleName, &dwHandle);<br /> if ( dwDataSize == 0 )<br /> return FALSE;<br /> // Allocate buffer and retrieve version information<br /> m_lpVersionData = new BYTE[dwDataSize];<br /> if (!::GetFileVersionInfo((LPTSTR)lpszModuleName, dwHandle, dwDataSize,<br /> (void**)m_lpVersionData) )<br /> {<br /> Close();<br /> return FALSE;<br /> }<br /> // Retrieve the first language and character-set identifier<br /> UINT nQuerySize;<br /> DWORD* pTransTable;<br /> if (!::VerQueryValue(m_lpVersionData, _T("//VarFileInfo//Translation"),<br /> (void **)&pTransTable, &nQuerySize) )<br /> {<br /> Close();<br /> return FALSE;<br /> }<br /> // Swap the words to have lang-charset in the correct format<br /> m_dwLangCharset = MAKELONG(HIWORD(pTransTable[0]), LOWORD(pTransTable[0]));<br /> return TRUE;<br />}<br />CString CFileVersion::QueryValue(LPCTSTR lpszValueName,<br /> DWORD dwLangCharset /* = 0*/)<br />{<br /> // Must call Open() first<br /> ASSERT(m_lpVersionData != NULL);<br /> if ( m_lpVersionData == NULL )<br /> return (CString)_T("");<br /> // If no lang-charset specified use default<br /> if ( dwLangCharset == 0 )<br /> dwLangCharset = m_dwLangCharset;<br /> // Query version information value<br /> UINT nQuerySize;<br /> LPVOID lpData;<br /> CString strValue, strBlockName;<br /> strBlockName.Format(_T("//StringFileInfo//%08lx//%s"),<br /> dwLangCharset, lpszValueName);<br /> if ( ::VerQueryValue((void **)m_lpVersionData, strBlockName.GetBuffer(0),<br /> &lpData, &nQuerySize) )<br /> strValue = (LPCTSTR)lpData;<br /> strBlockName.ReleaseBuffer();<br /> return strValue;<br />}<br />BOOL CFileVersion::GetFixedInfo(VS_FIXEDFILEINFO& vsffi)<br />{<br /> // Must call Open() first<br /> ASSERT(m_lpVersionData != NULL);<br /> if ( m_lpVersionData == NULL )<br /> return FALSE;<br /> UINT nQuerySize;<br />VS_FIXEDFILEINFO* pVsffi;<br /> if ( ::VerQueryValue((void **)m_lpVersionData, _T("//"),<br /> (void**)&pVsffi, &nQuerySize) )<br /> {<br /> vsffi = *pVsffi;<br /> return TRUE;<br /> }<br /> return FALSE;<br />}<br />CString CFileVersion::GetFixedFileVersion()<br />{<br /> CString strVersion;<br />VS_FIXEDFILEINFO vsffi;<br /> if ( GetFixedInfo(vsffi) )<br /> {<br /> strVersion.Format (_T("%u,%u,%u,%u"),HIWORD(vsffi.dwFileVersionMS),<br /> LOWORD(vsffi.dwFileVersionMS),<br /> HIWORD(vsffi.dwFileVersionLS),<br /> LOWORD(vsffi.dwFileVersionLS));<br /> }<br /> return strVersion;<br />}<br />CString CFileVersion::GetFixedProductVersion()<br />{<br /> CString strVersion;<br />VS_FIXEDFILEINFO vsffi;<br /> if ( GetFixedInfo(vsffi) )<br /> {<br /> strVersion.Format (_T("%u,%u,%u,%u"), HIWORD(vsffi.dwProductVersionMS),<br /> LOWORD(vsffi.dwProductVersionMS),<br /> HIWORD(vsffi.dwProductVersionLS),<br /> LOWORD(vsffi.dwProductVersionLS));<br /> }<br /> return strVersion;<br />}  

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.