#include <iostream>
#include <string>
#ifdef _WIN32
#include <windows.h>
#else
#include <cstdlib>
#include <cstdio>
#endif
std::string getExeFileVersion(const std::string& filePath)
{
std::string version;
#ifdef _WIN32
DWORD handle;
DWORD infoSize = GetFileVersionInfoSizeA(filePath.c_str(), &handle);
if (infoSize > 0) {
std::vector<BYTE> buffer(infoSize);
if (GetFileVersionInfoA(filePath.c_str(), handle, infoSize, buffer.data())) {
VS_FIXEDFILEINFO* fileInfo;
UINT fileInfoSize;
if (VerQueryValueA(buffer.data(), "\\", (LPVOID*)&fileInfo, &fileInfoSize)) {
unsigned int major = (fileInfo->dwFileVersionMS >> 16) & 0xffff;
unsigned int minor = (fileInfo->dwFileVersionMS) & 0xffff;
unsigned int patch = (fileInfo->dwFileVersionLS >> 16) & 0xffff;
unsigned int build = (fileInfo->dwFileVersionLS) & 0xffff;
version = std::to_string(major) + "." + std::to_string(minor) + "." + std::to_string(patch) + "." + std::to_string(build);
}
}
}
#elif defined(__linux__)
// 在Linux平台,可以使用命令行工具"readelf"来获取可执行文件的版本号
std::string command = "readelf -p .comment " + filePath;
FILE* pipe = popen(command.c_str(), "r");
if (pipe) {
char buffer[128];
std::string result;
while (!feof(pipe)) {
if (fgets(buffer, 128, pipe) != nullptr) {
result += buffer;
}
}
pclose(pipe);
size_t pos = result.find("GCC:");
if (pos != std::string::npos) {
size_t startPos = pos + 4;
size_t endPos = result.find_first_of("\n", startPos);
version = result.substr(startPos, endPos - startPos);
}
}
#endif
return version;
}
int main()
{
std::string exeFilePath = "path/to/exe/file";
std::string version = getExeFileVersion(exeFilePath);
std::cout << "Exe file version: " << version << std::endl;
return 0;
}
获取exe版本号
-
-
字
2025-09-26 11:01