|
?
如下如所示,*.dll 或者*.exe文件的版本號分兩部分.
 第一部分是數值形式的版本號,而第二部分是資源中的文字字符串。
下面的代碼做為修改版本號的參考
typedef?struct?_tagLanguage

{
????WORD?wLanguage;
????WORD?wCodePage;
}
tagLanguage,?
*
LPLanguage;

struct?VS_VERSIONINFO

{
????WORD????????????????wLength;
????WORD????????????????wValueLength;
????WORD????????????????wType;
????WCHAR???????????????szKey[
1
];
????WORD????????????????wPadding1[
1
];
????VS_FIXEDFILEINFO????Value;
????WORD????????????????wPadding2[
1
];
????WORD????????????????wChildren[
1
];
}
;
//
?these?macros?help?to?align?on?r-byte?boundaries?(thanks?Ted?Peck)
#define?roundoffs(a,b,r)?(((BYTE?
*
)?(b)?
-
?(BYTE?
*
)?(a)?
+
?((r)?
-
?
1
))?
&
?
~
((r)?
-
?
1
))
#define?roundpos(a,b,r)?(((BYTE?
*
)?(a))?
+
?roundoffs(a,b,r))


{
????????DWORD?dwVerHnd?
=
?
0
;
????????DWORD?dwVerInfoSize?
=
?GetFileVersionInfoSize(?m_strLastSignedArchivesDir?
+
?strShortFilePath,?
&
dwVerHnd);
????????
if
?(?dwVerInfoSize?
>
?
0
?)
 ????????
{
????????????LPWSTR?lpstrVffInfo?
=
?(LPWSTR)
new
?BYTE[dwVerInfoSize];?
????????????ZeroMemory(?lpstrVffInfo,?dwVerInfoSize);

????????????
if
?(GetFileVersionInfo(?m_strLastSignedArchivesDir?
+
?strShortFilePath,?dwVerHnd,?dwVerInfoSize,?lpstrVffInfo))?
 ????????????
{
????????????????UINT?uTemp?
=
?
0
;
????????????????VS_VERSIONINFO??????
*
pVerInfo;
????????????????LPBYTE??????????????pOffsetBytes;
????????????????VS_FIXEDFILEINFO????
*
pFixedInfo;

????????????????pVerInfo?
=
?(VS_VERSIONINFO?
*
)?lpstrVffInfo;
????????????????pOffsetBytes?
=
?(BYTE?
*
)?
&
pVerInfo
->
szKey[_tcslen(pVerInfo
->
szKey)?
+
?
1
];
????????????????pFixedInfo?
=
?(VS_FIXEDFILEINFO?
*
)?roundpos(pVerInfo,?pOffsetBytes,?
4
);

????????????????pFixedInfo
->
dwFileVersionLS????
=
?pFixedInfo
->
dwFileVersionLS?
+
?
0x00000001
;
????????????????pFixedInfo
->
dwProductVersionLS?
=
?pFixedInfo
->
dwProductVersionLS?
+
?
0x00000001
;

????????????????LPLanguage?lpTranslate?
=
?NULL;
????????????????VerQueryValue(?lpstrVffInfo,?_T(
"
\\VarFileInfo\\Translation
"
),?(LPVOID?
*
)?
&
lpTranslate,?
&
uTemp);

????????????????CString?strPath;
????????????????LPTSTR??pValueBuffer;

????????????????strPath.Format(_T(
"
\\StringFileInfo\\%04x%04x\\FileVersion
"
)
????????????????????,?lpTranslate
->
wLanguage
????????????????????,?lpTranslate
->
wCodePage
????????????????????);

????????????????VerQueryValue(?lpstrVffInfo
????????????????????,?strPath.GetBuffer()
????????????????????,?(LPVOID?
*
)
&
pValueBuffer
????????????????????,?
&
uTemp
????????????????????);
????????????????strPath.ReleaseBuffer();
????????????????ZeroMemory(?pValueBuffer,?_tcslen(pValueBuffer)?
*
?sizeof(TCHAR));

????????????????strPath.Format(_T(
"
\\StringFileInfo\\%04x%04x\\ProductVersion
"
)
????????????????????,?lpTranslate
->
wLanguage
????????????????????,?lpTranslate
->
wCodePage
????????????????????);

????????????????VerQueryValue(?lpstrVffInfo
????????????????????,?strPath.GetBuffer()
????????????????????,?(LPVOID?
*
)
&
pValueBuffer
????????????????????,?
&
uTemp
????????????????????);
????????????????strPath.ReleaseBuffer();
????????????????ZeroMemory(?pValueBuffer,?_tcslen(pValueBuffer)?
*
?sizeof(TCHAR));

????????????????HANDLE?hResource?
=
?BeginUpdateResource(strDest,?FALSE);
????????????????
if
?(NULL?
!=
?hResource)
 ????????????????
{
????????????????????
if
?(UpdateResource(hResource,?RT_VERSION,?MAKEINTRESOURCE(VS_VERSION_INFO),?lpTranslate
->
wLanguage,?lpstrVffInfo,?dwVerInfoSize)?
!=
?FALSE)
????????????????????????EndUpdateResource(hResource,?FALSE);
????????????????}
????????????}
????????????delete?[]?lpstrVffInfo;
????????}
????}
對于資源中的文本類型的版本號,如FileVersion, ProductVersion, 修改的字符串長度不能超過原長度。如果不足的話末尾用'\0‘填不滿。 所以,在編譯的時候,盡量在資源中設置一個長一點的字符串來占位,免得到時候修改的時候空間不足。
|