1. 程式人生 > 其它 >修改檔案版本號方法

修改檔案版本號方法

  滑鼠右鍵選擇檔案屬性可以顯示詳細資訊, 裡面可以顯示版本號 :

  修改這個版本號也簡單, 可以直接用 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);