zoukankan      html  css  js  c++  java
  • 如何写入和获取软件的版本信息(VS环境下)

                                 *******************************
                                 *如何写入和获取软件版本信息(VS环境下)*
                                 *******************************
    如何写入软件版本信息
    很简单,创建一个基于MFC的dll工程就会自动生成一个resource.rc文件,把里面版本信息相关的东西复制过来稍加修改即可。

    /////////////////////////////////////////////////////////////////////////////
    //
    // 版本
    // 
    
    VS_VERSION_INFO     VERSIONINFO
      FILEVERSION       2014,0,0,2053
      PRODUCTVERSION    2,0,0,1
     FILEFLAGSMASK VS_FFI_FILEFLAGSMASK
    #ifdef _DEBUG
     FILEFLAGS VS_FF_DEBUG
    #else
     FILEFLAGS 0x0L
    #endif
     FILEOS VOS_NT_WINDOWS32
     FILETYPE        VFT_APP//VFT_UNKNOWN//VFT_DLL : dll type
     FILESUBTYPE VFT2_UNKNOWN
    BEGIN
        BLOCK "StringFileInfo"
        BEGIN
            BLOCK "080404B0"
            BEGIN
                VALUE "CompanyName", "Wesky Soft"
                VALUE "FileDescription", "DLL Fix Utility"
                VALUE "FileVersion",     "2014.0.0.2053"
                VALUE "InternalName",    "DllSuite"
                VALUE "LegalCopyright", "(C) <Wesky Soft>。保留所有权利。"
                VALUE "OriginalFilename","DllSuite.exe"
                VALUE "ProductName", "DLLSuite"
                VALUE "ProductVersion",  "2.0.0.1"
            END
        END
        BLOCK "VarFileInfo"
        BEGIN
            VALUE "Translation", 0x0804, 1200
        END
    END

    Tips:
    1.注意文件版本和产品版本有两个指定的地方,务必保持一致,而且一定一定要注意前面的用逗号隔开,后面的用点号隔开(一个逗号引发的血案..)
    2.相关的宏定义在文件VerRsrc.h中

    如何获取文件版本信息

    void _LoadFileVersion()
    {
        DWORD dwHandle = 0;
        char* pInfoData = NULL ;
        
        WCHAR szSelfName[MAX_PATH+1] = {0};
        if(::GetModuleFileName(NULL, szSelfName, MAX_PATH+1))
        {
            DWORD dwInfoSize = GetFileVersionInfoSize(szSelfName, &dwHandle);
            if(dwInfoSize > 0)
            {
                pInfoData = new char[dwInfoSize];
                memset(pInfoData, 0, dwInfoSize);
                if(GetFileVersionInfo(szSelfName, dwHandle, dwInfoSize, pInfoData))
                {                
                    VS_FIXEDFILEINFO* vs_file_info = NULL;
                    unsigned int size = 0;
                    if(VerQueryValue(pInfoData, L"\", (LPVOID*)&vs_file_info, &size))
                    {
                        m_cFileVer.Empty();
                        m_cFileVer.Format(L"%d.%d.%d.%d", HIWORD(vs_file_info->dwFileVersionMS), LOWORD(vs_file_info->dwFileVersionMS), HIWORD(vs_file_info->dwFileVersionLS), LOWORD(vs_file_info->dwFileVersionLS));
                        SetItemText(IDC_FILEVER, m_cFileVer.GetString());
                    }
                }
                if(pInfoData)
                {
                    delete[] pInfoData;
                    pInfoData = NULL;
                }
            }
        }
    }

    测试结果:

  • 相关阅读:
    初识JAVA
    计算机语言发展史
    课时11:禁用、清理二级缓存,以及整合Ehcache缓存
    课时10:MyBatis一级缓存、二级缓存
    课时9::MyBatis整合Log4j、延迟加载
    课时7:动语态SQL、foreach、输入参数为类中的集合属性、集合、数组、动态数组
    课时6 输出参数为简单类型、对象类型、HashMap及resultMap使用
    课时5 入参为HashMap,以及mybatis调用存储过程CRUD
    课时4:l两种取值符号以及ParameterType为简单,对象,嵌套对象类型
    课时3:属性文件丶全局参数丶别名丶类型转换器丶resultMap
  • 原文地址:https://www.cnblogs.com/tupx/p/3656078.html
Copyright © 2011-2022 走看看