zoukankan      html  css  js  c++  java
  • 修改文件版本号方法

      鼠标右键选择文件属性可以显示详细信息, 里面可以显示版本号 : 

      修改这个版本号也简单, 可以直接用 VS 的打开文件的方式打开它(只有这样打开才是查看详细信息的) : 

      然后双击版本信息就能编辑了, 编辑后保存就能修改了 : 

      手动的也挺方便的, 不过如果要使用代码来修改, 就有点麻烦了, 我找到一份C++的代码, 修改了可以正常使用 : 

    -- 使用的是 dll 导出工程, 它提供了很多库的自动引用和宏

    // pch.h: 预编译标头
    
    #ifndef PCH_H
    #define PCH_H
    
    #include "framework.h"
    #include <string>
    
    #define LIBEXPORT_API extern "C" __declspec(dllexport)
    LIBEXPORT_API BOOL SetFileVersion(LPCTSTR filePath, int major, int minor, int build, int revision = 0);
    
    #endif //PCH_H
    // pch.cpp: 与预编译标头对应的源文件
    
    #include "pch.h"
    #include <string>
    #include <windows.h> 
    #include <shlwapi.h> 
    #include <tchar.h>
    
    
    #pragma region Write File Version Info
    #pragma comment(lib, "version.lib")
    #pragma comment(lib, "shlwapi")
    
    struct
    {
        WORD wLanguage;
        WORD wCodePage;
    } *lpTranslate;
    
    BOOL SetFileVersion(LPCTSTR filePath, int major, int minor, int build, int revision)
    {
        if (NULL == filePath || !PathFileExists(filePath))
            return FALSE;
    
        BOOL bRet = FALSE;
        DWORD dwHandle = 0;
        DWORD dwSize = 0;
    
        dwSize = GetFileVersionInfoSize(filePath, &dwHandle);
        if (0 >= dwSize)
            return bRet;
    
        LPBYTE lpBuffer = new BYTE[dwSize];
        memset(lpBuffer, 0, dwSize);
    
        if (GetFileVersionInfo(filePath, dwHandle, dwSize, lpBuffer) != FALSE)
        {
            HANDLE hResource = BeginUpdateResource(filePath, FALSE);
            if (NULL != hResource)
            {
                UINT uTemp;
                DWORD dwVer[4] = { 0 };
    
                if (VerQueryValue(lpBuffer, TEXT("\VarFileInfo\Translation"), (LPVOID*)&lpTranslate, &uTemp) != FALSE)
                {
                    LPVOID lpFixedBuf = NULL;
                    DWORD dwFixedLen = 0;
                    if (FALSE != VerQueryValue(lpBuffer, TEXT("\"), &lpFixedBuf, (PUINT)&dwFixedLen))
                    {
                        VS_FIXEDFILEINFO* pFixedInfo = (VS_FIXEDFILEINFO*)lpFixedBuf;
    
                        long MS = (((long)major) << 16) + minor;
                        long LS = (((long)build) << 16) + revision;
    
                        pFixedInfo->dwFileVersionMS = MS;
                        pFixedInfo->dwFileVersionLS = LS;
    
                        dwVer[0] = HIWORD(pFixedInfo->dwFileVersionMS);
                        dwVer[1] = LOWORD(pFixedInfo->dwFileVersionMS);
                        dwVer[2] = HIWORD(pFixedInfo->dwFileVersionLS);
                        dwVer[3] = LOWORD(pFixedInfo->dwFileVersionLS);
                    }
    
                    // 修改版本的文本信息
                    LPVOID lpStringBuf = NULL;
                    DWORD dwStringLen = 0;
                    TCHAR szTemp[MAX_PATH] = { 0 };
                    TCHAR szVersion[MAX_PATH] = { 0 };
    
                    _stprintf_s(szTemp, MAX_PATH - 1, TEXT("\StringFileInfo\%04x%04x\FileVersion"), lpTranslate->wLanguage, lpTranslate->wCodePage);
                    _stprintf_s(szVersion, MAX_PATH - 1, TEXT("%d.%d.%d.%d"), dwVer[0], dwVer[1], dwVer[2], dwVer[3]);
    
                    if (FALSE != VerQueryValue(lpBuffer, szTemp, &lpStringBuf, (PUINT)&dwStringLen))
                        memcpy(lpStringBuf, szVersion, (_tcslen(szVersion) + 1) * sizeof(TCHAR));
    
                    memset(szTemp, 0, sizeof(szTemp));
                    _stprintf_s(szTemp, MAX_PATH - 1, TEXT("\StringFileInfo\%04x%04x\ProductVersion"), lpTranslate->wLanguage, lpTranslate->wCodePage);
    
                    if (FALSE != VerQueryValue(lpBuffer, szTemp, &lpStringBuf, (PUINT)&dwStringLen))
                        memcpy(lpStringBuf, szVersion, (_tcslen(szVersion) + 1) * sizeof(TCHAR));
    
                    // 更新  
                    if (UpdateResource(hResource, RT_VERSION, MAKEINTRESOURCE(VS_VERSION_INFO), lpTranslate->wLanguage, lpBuffer, dwSize) != FALSE)
                    {
                        if (EndUpdateResource(hResource, FALSE) != FALSE)
                            bRet = TRUE;
                    }
                }
            }
        }
    
        if (lpBuffer)
            delete[] lpBuffer;
    
        return bRet;
    }
    
    #pragma endregion Write File Version Info

      这样导出个 dll 就能用了 : 

        [System.Runtime.InteropServices.DllImport("XXXX.dll")]
        public static extern bool SetFileVersion([MarshalAsAttribute(UnmanagedType.LPWStr)] string filePath, int major, int minor, int build, int revision = 0);
  • 相关阅读:
    Nginx教程(三) Nginx日志管理
    Nginx教程(二) Nginx虚拟主机配置
    官方解析Cookies和Session的区别
    J2EE十三个技术规范
    J2EE十三个规范小结
    tomcat -web.xml里的内容
    tcp协议和udp协议的使用场景
    IntelliJ IDEA创建maven web项目(IDEA新手适用)
    Maven安装与配置
    X86、X64和X86_64区别
  • 原文地址:https://www.cnblogs.com/tiancaiwrk/p/15209324.html
Copyright © 2011-2022 走看看