• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            S.l.e!ep.¢%

            像打了激速一樣,以四倍的速度運(yùn)轉(zhuǎn),開(kāi)心的工作
            簡(jiǎn)單、開(kāi)放、平等的公司文化;尊重個(gè)性、自由與個(gè)人價(jià)值;
            posts - 1098, comments - 335, trackbacks - 0, articles - 1
              C++博客 :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

            Introduction

            There are several good articles here about reading module version information (by shaman74 and Armen Hakobyan), also there are some about modifying RC files during the build process (by Srinivas Vaithianathan and gugulea).

            But sometimes, one needs to modify the version information in a compiled executable(s) or DLL:

            • Change product name, company name, comments, etc. when deploying multiple products under different names (different skins, branding, resources) but same code;
            • Update DLL version numbers without having to modify dozens of RC files;
            • Modify a self-extractable archive's (simple installers) resources to reflect the product name and the version information of the contained application.

            Description

            This library provides an easy way to read, modify, and save version information resource(s) (RT_VERSION) in compiled executable modules (EXE, DLL, OCX, SCR, etc.).

            Collapse Copy Code
            CVersionInfo vi(strModulePath);
            //Initialize version information object, //load first RT_VERSION resource// Set file version in both VS_FIXEDFILEINFO// and in all string tables// FileVersion string will be set// to "4, 5, 0, 3" just like VS does
            vi.SetFileVersion(4, 5, 0, 3, 
                   TRUE /*Update StringTables*/);
            
            // Alternatively, if you need to set// non-numeric version number// like 4.5.0.3452Rus.RelB.MFC7 use// vi["FileVersion"] = "4.5.0.3452Rus.RelB.MFC7"// Set Comments string
            vi["Comments"] = "We will stick to C++";
            
            // Save modified version information to module,// resource id, and language// that we CVersionInfo from
            vi.Save();

            Classes exported from VerLibInfo

            • CVersionInfo - The main class; reads and writes complete version information resources to/from modules. Contains CStringFileInfo and VS_FIXEDFILEINFO. The VarFileInfo structure is not a part of this object, because it is basically computed data. When saving modified version information, proper VarFileInfo is calculated from the number of string tables and their language-codepage keys.
            • CStringFileInfo - The wrapper for the StringFileInfo structure (contains string tables for different translations of the version information).
            • CStringTable- The wrapper for the string-table structure (contains the actual name-value pairs).
            • CVersionInfoString - The wrapper for the string structure.

            CVersionInfo reference

            Collapse Copy Code
            				//
            				 Construction/Destruction
            				//
            				 Construct uninitialized empty
            				//
            				 version information object
            CVersionInfo(); 
            
            // Construct object, populate structures// from RT_VERSION resource of a given module
            CVersionInfo(const CString& strModulePath, 
                         LPCTSTR lpszResourceId = NULL /*Auto*/, 
                         WORD wLangId = 0xFFFF /*Auto*/);
            virtual ~CVersionInfo();
            
            //Read version information from module
            BOOL FromFile(const CString& strModulePath, 
                 LPCTSTR lpszResourceId = NULL /*Auto*/, 
                 WORD wLangId = 0xFFFF /*Auto*/);
            
            //Save version information to module resource //(specify strModulePath, lpszResourceId & wLangId //to copy resource to different module, resource, language)
            BOOL ToFile(const CString& strModulePath = "", 
                 LPCTSTR lpszResourceId = NULL /*Auto*/, 
                 WORD wLangId = 0xFFFF /*Auto*/);
            
            //Quick save (saves to the same module, resource, //and language that it was loaded from)
            BOOL Save();
            
            //Resets (removes all string tables //and cleans fixed version info)void Reset();
            
            // Validates object (mostly used to verify //that version information was //successfully loaded from module)
            BOOL IsValid() const;
            
            // Get/Set the order of blocks //(Regular (TRUE) = StringFileInfo first, VarFileInfo 2nd)
            BOOL GetInfoBlockOrder() const;
            void SetInfoBlockOrder(BOOL bRegularStringsFirst);
            
            // Get reference to CStringFileInfo const CStringFileInfo& GetStringFileInfo() const;
            CStringFileInfo& GetStringFileInfo();
            
            // Overloaded bracket operators allow //quick access to first string table in StringFileInfo r/wconst CString operator [] (const CString &strName) const;
            CString &operator [] (const CString &strName);
            
            // Get reference to VS_FIXEDFILEINFOconst VS_FIXEDFILEINFO& GetFixedFileInfo() const;
            VS_FIXEDFILEINFO& GetFixedFileInfo();
            
            // SetFileVersion - Updates file version //in VS_FIXEDFILEINFO and in string tables //when bUpdateStringTables == TRUEvoid SetFileVersion(WORD dwFileVersionMSHi, 
                                WORD dwFileVersionMSLo, 
                                WORD dwFileVersionLSHi, 
                                WORD dwFileVersionLSLo, 
                                BOOL bUpdateStringTables = TRUE);
            void SetFileVersion(DWORD dwFileVersionMS, 
                                DWORD dwFileVersionLS, 
                                BOOL bUpdateStringTables = TRUE);
            
            // SetProductVersion - Updates product version// in VS_FIXEDFILEINFO and ALL string tables// when bUpdateStringTables == TRUEvoid SetProductVersion(WORD dwProductVersionMSHi, 
                                   WORD dwProductVersionMSLo, 
                                   WORD dwProductVersionLSHi, 
                                   WORD dwProductVersionLSLo, 
                                   BOOL bUpdateStringTables = TRUE);
            void SetProductVersion(DWORD dwProductVersionMS, 
                                   DWORD dwProductVersionLS, 
                                   BOOL bUpdateStringTables = TRUE);

            Sample usage

            The attached file contains a sample project that utilizes the library (VerInfoLibTest). The test tool understands several command line parameters:

            Collapse Copy Code
            Test Application for Version Info Library
            USAGE:
            VerInfoLibTest.exe -system
            Prints out version numbers of all DLLs in Windows system folder
            
            VerInfoLibTest.exe -f <FileName>
            Prints out version info string tables of a specified module
            
            VerInfoLibTest.exe -u <FileName> <StringName> "<Value>"
            Modifies the StringName value in the first String Table 
                     in module version information
            
            EXAMPLES:
            VerInfoLibTest.exe -u mydll.dll CompanyName "New company name"
            VerInfoLibTest.exe -u mydll.dll Comments "Updated comment"
            VerInfoLibTest.exe -f mydll.dll

            The code for "-system":

            Collapse Copy Code
            WIN32_FIND_DATA FindFileData;
            HANDLE hFind;
                
            TCHAR szBuf[MAX_PATH];
            ::GetSystemDirectory(szBuf, MAX_PATH);
            CString strSystemFolder = szBuf;
            
            hFind = FindFirstFile(strSystemFolder + "\\*.dll", &FindFileData);
            
            if (hFind == INVALID_HANDLE_VALUE) 
            {
                printf ("Invalid File Handle. ""Get Last Error reports %d\n", 
                        GetLastError ());
            } 
            else 
            {
                do
                {
                    CString strModulePath = strSystemFolder + 
                               "\\" + FindFileData.cFileName;
            
                    const CVersionInfo vi(strModulePath);
                    
                    if (vi.IsValid())
                    {
                        _tprintf(_T("%s\t%s\n"), 
                                 FindFileData.cFileName, 
                                 vi["FileVersion"]);
                    }
                    
                }
                while (FindNextFile(hFind, &FindFileData));
                
                FindClose(hFind);
            }

            The code for "-f <FileName>":

            Collapse Copy Code
            				const CVersionInfo vi(strFilePath);
            if (vi.IsValid())
            {
                POSITION posTable = 
                  vi.GetStringFileInfo().GetFirstStringTablePosition();
                while (posTable)
                {
                    const CStringTable &st = 
                          *vi.GetStringFileInfo().GetNextStringTable(posTable);
                    
                    _tprintf(_T("String table %s\n-----") 
                             _T("-------------------------\n"), 
                             st.GetKey());
                    
                    POSITION posString = st.GetFirstStringPosition();
                    
                    while (posString)
                    {
                        const CVersionInfoString &vistr = 
                                 *st.GetNextString(posString);
                        _tprintf(_T("%s=%s\n"), vistr.GetKey(), 
                                             vistr.GetValue());
                    }
                    _tprintf(_T("------------------------------\n"));
                }
            }
            else
            {
                _tprintf(_T("Failed to get module version") 
                         _T(" information for %s\n"), strFilePath);
            }

            This will produce an output similar to:

            Collapse Copy Code
            C:\...eProject\Article1\Output\Release>
                       VerInfoLibTest.exe -f VerInfoLib.dll
            String table 040904b0
            ------------------------------
            Comments=
            CompanyName=Denis Zabavchik
            FileDescription=VerInfoLib DLL
            FileVersion=1, 0, 0, 1
            InternalName=VerInfoLib
            LegalCopyright=Copyright (C) 2006
            LegalTrademarks=
            OriginalFilename=VerInfoLib.DLL
            PrivateBuild=
            ProductName=VerInfoLib Dynamic Link Library
            ProductVersion=1, 0, 0, 1
            SpecialBuild=
            ------------------------------

            The code for updating a given string is very neat (-u <FileName> <StringName> "<Value>"):

            Collapse Copy Code
            				if (!_tcscmp(argv[1], _T("-u")))
            {
                // 2nd argument is the file path
                CString strFilePath(argv[2]);
                CVersionInfo vi(strFilePath);
                vi[argv[3]] = argv[4];
                
                vi.Save();
            }

            Notes

            The code compiles and works in VC6 and 2005 (both MBCS and UNICODE are supported). MFC is used for the container classes, maps etc. The code can be easily ported to be used without MFC.

            License

            This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)

            About the Author

            Denis Zabavchik


            Member

            Occupation: Software Developer (Senior)
            Location: Russian Federation Russian Federation
            怡红院日本一道日本久久 | 97精品国产97久久久久久免费| 久久天天躁狠狠躁夜夜2020| 无码8090精品久久一区| 色8久久人人97超碰香蕉987| 亚洲午夜精品久久久久久人妖| 精品久久久久久无码国产| 亚洲伊人久久精品影院| 国产综合久久久久| 国产精品久久久久久久人人看| 久久精品国产精品青草| 久久强奷乱码老熟女网站| 久久99国产精品成人欧美| 久久婷婷是五月综合色狠狠| 人妻精品久久无码区| 久久精品国产欧美日韩| 99久久国产免费福利| 99久久做夜夜爱天天做精品| 国产一久久香蕉国产线看观看| 日韩美女18网站久久精品| 精品精品国产自在久久高清| 精品久久久久久久国产潘金莲 | 亚洲精品无码久久不卡| 久久夜色精品国产www| 精品无码久久久久国产| 久久精品国产亚洲av麻豆图片| 精品无码人妻久久久久久| 国产一久久香蕉国产线看观看| 中文无码久久精品| 久久婷婷午色综合夜啪| 久久久久久极精品久久久| 久久免费高清视频| 国产精品熟女福利久久AV| 国产精品成人99久久久久| 久久w5ww成w人免费| 国产成人久久激情91| 日本精品久久久久中文字幕8| 伊人久久大香线蕉综合影院首页| 亚洲精品无码专区久久同性男 | 无遮挡粉嫩小泬久久久久久久| 久久久国产精品亚洲一区|