首页 > 解决方案 > 如何使字符串出现在编译的二进制可执行文件的开头?

问题描述

在 Windows 和 Debian 上为 armhf 使用 GCC 和 C++11。

我需要检查可执行文件的版本字符串,以查看我的应用程序是否必须自行更新。

我的“版本字符串”是这样制作的:

#define VersionFileCap "-[+@+]-"
const char VersioneFile[] = { VersionFileCap MYAPP_VERSION "," __DATE__ VersionFileCap };

我可以在编译的二进制文件中看到它。

我的计划是搜索VersionFileCap,然后管理找到的字符串。为此,我将使用该问题的答案中的代码,但它将整个文件加载到内存中,这让我很担心,因为我的可执行文件很容易变得超过 50MB。

所以我想知道是否有一种方法可以在二进制文件的开头编译字符串,这样我就可以加载文件的一部分并更快地找到它。

仅使用一些预处理/编译器魔术参数是否有可能?

标签: c++gcc

解决方案


至少在 Windows 上,处理此问题的正确方法是将应用的版本值存储在应用的VERSIONINFO资源中,而不是存储在应用代码中的字符串中。

如果应用程序想要使用版本信息来填充它的VersioneFile[]数组,它可以在运行时动态地这样做。

VERSIONINFOMicrosoft 具有专门设计用于从可执行文件(EXE 或 DLL)的资源中查询数据的 Win32 API 函数:

GetFileVersionInfoSize()

GetFileVersionInfo()

VerQueryValue()

您的应用可以查询自己的版本数据。外部更新程序可以查询您应用的版本数据。

Win32 API 可以访问可执行文件的资源,而无需一次将整个文件加载到内存中。

有关详细信息,请参阅MSDN 上的版本信息


推荐阅读