<menu id="w8yyk"><menu id="w8yyk"></menu></menu>
  • <dd id="w8yyk"><nav id="w8yyk"></nav></dd>
    <menu id="w8yyk"></menu>
    <menu id="w8yyk"><code id="w8yyk"></code></menu>
    <menu id="w8yyk"></menu>
    <xmp id="w8yyk">
    <xmp id="w8yyk"><nav id="w8yyk"></nav>
  • 網站首頁 > 物聯資訊 > 技術分享

    VC使用#定義方便控制版本號的宏

    2016-09-28 00:00:00 廣州睿豐德信息科技有限公司 閱讀
    睿豐德科技 專注RFID識別技術和條碼識別技術與管理軟件的集成項目。質量追溯系統、MES系統、金蝶與條碼系統對接、用友與條碼系統對接

    一個 VC Project 中,可能有很多地方需要用到版本號,比如 About 對話框、版本資源等。如果每次版本更改都一一去改變這些值,不但非常麻煩,而且有悖唯一原則。

          巧妙地使用宏定義,可以很好地解決這個問題。

          先來看看幾個預處理操作符 (Preprocessor Operators):

    Operator Action Stringizing operator (#) Causes the corresponding actual argument to be enclosed in double quotation marks Charizing operator (#@) Causes the corresponding argument to be enclosed in single quotation marks and to be treated as a character (Microsoft Specific) Token-pasting operator (##) Allows tokens used as actual arguments to be concatenated to form other tokens

          簡單說,# 就是使參數用引號包住,形成字符串;#@ 使參數用單引號包住,形成一個字符;## 是粘結符。這幾個操作符從語言上來說比較晦澀,仔細看看 MSDN 的例子,好好理解一下。

          下面舉例說一下怎么定義統一的版本宏。

          假設工程中有資源腳本文件 Resource.rc,唯一的版本號碼存放在 Define.h 里。其它需要用到版本號的 CPP 文件均包含此文件。

          先看看 Define.h:

     #define VER_Major             2
    #define VER_Minor            2
    #define VER_Release          137
    #define VER_Build            1762
    #define VER_Version          MAKELONG(MAKEWORD(VER_Major, VER_Minor), VER_Release)

    #define _Stringizing(v)      #v
    #define _VerJoin(a,b,c,d)    _Stringizing(a.b.c.d)

    #define STR_BuildDate        TEXT(__DATE__)
    #define STR_BuildTime        TEXT(__TIME__)
    #define STR_BuilDateTime     TEXT(__DATE__) TEXT(" ") TEXT(__TIME__)
    #define STR_Version          TEXT(_VerJoin(VER_Major, VER_Minor, VER_Release, VER_Build))

          假設有了上面的定義后,就可以方便地使用 VER_Major、VER_Minor、VER_Release、VER_Build 作為版本號數字;STR_Version 作為版本字符串 (上面的例子中 STR_Version 執行宏展開后是 TEXT("2.2.137.1763") 的 TCHAR 字符串)。任何 CPP 文件中可以直接使用這些宏定義。

          資源腳本 Resource.rc    中,假設我們需要版本資源,可以首先在 Define.h 中再定義一些宏,比如:

     #define STR_AppName         TEXT("CuteFoto")
    #define STR_Author         TEXT("Yonsm")
    #define STR_Corporation    TEXT("Yonsm.NET")
    #define STR_Web            TEXT("Yonsm.reg365.com")
    #define STR_Email          TEXT("Yonsm@163.com")
    #define STR_WebUrl         TEXT("http://") STR_Web
    #define STR_EmailUrl       TEXT("mailto:") STR_Email TEXT("?Subject=") STR_AppName


    #ifdef _CHS
    #define STR_Description    TEXT("靈巧的批量掃描照片切割工具。")
    #define STR_Copyright      TEXT("版權所有 (C) 2002-2004 ") STR_Corporation TEXT(",保留所有權利。")
    #else // _CHS
    #define STR_Description    TEXT("Picture cutting tool for batch-scanned photo.")
    #define STR_Copyright      TEXT("Copyright (C) 2002-2004 ") STR_Corporation TEXT(". All rights reserved.")
    #endif // _CHS

          這時,我們在 Resouurc.rc 中添加版本資源——注意,不要直接添加,否則會被 VS 更改成實際的值,這樣就不能達到我們的目的了。一個好的解決方法是:

    1. 在 VS IDE    中雙擊 Resource.rc 轉到 資源視圖 中,右擊 Resource.rc,選擇“資源包括”,在“只讀符號指令”中包含 Define.h:
       #define APSTUDIO_HIDDEN_SYMBOLS
      //……
      #include "Define.h"
      #include "Windows.h"
      //……
      #undef APSTUDIO_HIDDEN_SYMBOLS
    2. 在“編譯時指令”中輸入:
       LANGUAGE LANG_NEUTRAL, SUBLANG_DEFAULT
      #pragma code_page(DEFAULT)

      VS_VERSION_INFO VERSIONINFO
      FILEVERSION VER_Major, VER_Minor, VER_Release, VER_Build
      PRODUCTVERSION VER_Major, VER_Minor, VER_Release, VER_Build
      FILEFLAGSMASK VS_FFI_FILEFLAGSMASK
      FILEFLAGS 0
      FILEOS VOS__WINDOWS32
      FILETYPE 0
      FILESUBTYPE VFT2_UNKNOWN
      BEGIN
            BLOCK "StringFileInfo"
            BEGIN
                BLOCK "040004e4"
                BEGIN
                    VALUE "FileVersion", STR_Version
                    VALUE "FileDescription", STR_Description
                    VALUE "ProductName", STR_AppName
                    VALUE "ProductVersion", STR_Version
                    VALUE "CompanyName", STR_Corporation
                    VALUE "LegalCopyright", STR_Copyright
                    VALUE "Comments", "Powered by " STR_Author "."
                    VALUE "OriginalFilename", STR_AppName EXT_Exe
                END
            END
            BLOCK "VarFileInfo"
            BEGIN
                VALUE "Translation", 0x0400, 0x04e4
            END
      END

          OK,以后要更改版本號或程序信息,只要修改 Define.h 即可了。

          繼續……

          Define.h 中假設 VER_Release/VER_Build 分別指 Release 號和 Build 號,如果讓這兩個值分別表示我們用 Release 方式編譯的次數和總編譯次數,多好:)為此我寫了個小工具 BPP (Build++ 的意思):

          首先把 BPP.exe 放在工程目錄下,然后在 VC Project 屬性中,Debug 方式:在“生成事件”->“預生成事件”->“命令行”中輸入“BPP Define.h”,Release 方式:“BPP -Release Define.h”。這樣,每次 VC 編譯都會調用 BPP.exe 使 VER_Build 或 VER_Reelase 自增一。好酷酷吧……

    RFID管理系統集成商 RFID中間件 條碼系統中間層 物聯網軟件集成
    最近免费观看高清韩国日本大全