++的博客

你看不见我,你看不见我。。
随笔 - 22, 文章 - 0, 评论 - 2, 引用 - 0
数据加载中……

修改二进制文件中的版本号

 

如下如所示,*.dll 或者*.exe文件的版本号分两部分.
30.JPG
第一部分是数值形式的版本号,而第二部分是资源中的文字字符串。

下面的代码做为修改版本号的参考

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‘填不满。
所以,在编译的时候,尽量在资源中设置一个长一点的字符串来占位,免得到时候修改的时候空间不足。

posted on 2008-06-19 09:52 Jerry.Wang 阅读(2909) 评论(1)  编辑 收藏 引用 所属分类: 开发