首页 > 解决方案 > 编译时 Embarcadero C++ Builder 中的版本信息

问题描述

是否有可能在编译时获取项目版本信息(主要/次要/发布/构建)?像这样的东西?

#if MAJOR_VERSION=2
#include <fancyheader.h>
#else
#include <differentCoolStuff.h>
#endif

你的赫维格

标签: c++builder

解决方案


这是可以做到的。从 exe 文件中读取版本号可确保您读取的版本号(并可能基于它显示或更改 s/w 操作)与用户使用 Windows“属性”检查 exe 文件版本信息时看到的值相匹配检查,所以它很有意义。此代码适用于使用 C++ Builder 10.4(企业版 - 但它应该适用于任何版本)的 VCL 框架。

   String ExeFileName = ParamStr(0);
   unsigned long Handle;
   int VersionInfoSize = GetFileVersionInfoSize(ExeFileName.c_str(), &Handle);
   int VersionInfo[4];
   void *FileInfo;
   unsigned int Length;
   //if size is zero, then there is no version info in the exe
   if (VersionInfoSize > 0) {
      char *Buffer = new char[VersionInfoSize];
      try {
         GetFileVersionInfo(ExeFileName.c_str(), 0, VersionInfoSize, Buffer);
         VerQueryValue(Buffer, L"\\", &FileInfo, &Length);
         TVSFixedFileInfo *Info = static_cast<TVSFixedFileInfo *>(FileInfo);
         VersionInfo[0] = ((Info->dwFileVersionMS) >> 16);
         VersionInfo[1] = ((Info->dwFileVersionMS) & 0xffff);
         VersionInfo[2] = ((Info->dwFileVersionLS) >> 16);
         VersionInfo[3] = ((Info->dwFileVersionLS) & 0xffff);

      } catch (...) {
         VersionInfo[0] = 99;
         VersionInfo[1] = 88;
         VersionInfo[2] = 77;
         VersionInfo[3] = 66;
      }
      delete[] Buffer;
      // DO WHAT YOU WANT WITH VersionInfo HERE !!!
   }

推荐阅读