c++ - 如何使字符串出现在编译的二进制可执行文件的开头?
问题描述
在 Windows 和 Debian 上为 armhf 使用 GCC 和 C++11。
我需要检查可执行文件的版本字符串,以查看我的应用程序是否必须自行更新。
我的“版本字符串”是这样制作的:
#define VersionFileCap "-[+@+]-"
const char VersioneFile[] = { VersionFileCap MYAPP_VERSION "," __DATE__ VersionFileCap };
我可以在编译的二进制文件中看到它。
我的计划是搜索VersionFileCap,然后管理找到的字符串。为此,我将使用该问题的答案中的代码,但它将整个文件加载到内存中,这让我很担心,因为我的可执行文件很容易变得超过 50MB。
所以我想知道是否有一种方法可以在二进制文件的开头编译字符串,这样我就可以加载文件的一部分并更快地找到它。
仅使用一些预处理/编译器魔术参数是否有可能?
解决方案
至少在 Windows 上,处理此问题的正确方法是将应用的版本值存储在应用的VERSIONINFO
资源中,而不是存储在应用代码中的字符串中。
如果应用程序想要使用版本信息来填充它的VersioneFile[]
数组,它可以在运行时动态地这样做。
VERSIONINFO
Microsoft 具有专门设计用于从可执行文件(EXE 或 DLL)的资源中查询数据的 Win32 API 函数:
您的应用可以查询自己的版本数据。外部更新程序可以查询您应用的版本数据。
Win32 API 可以访问可执行文件的资源,而无需一次将整个文件加载到内存中。
有关详细信息,请参阅MSDN 上的版本信息。
推荐阅读
- qlikview - 将 Qliksense Cloud 连接到 redshift 时出错
- javascript - 调用一个函数,仅在加载其他函数时(JS/TS)
- python - 在这种情况下,是否有比 iterrows() 更有效的工具?
- vb.net - 任务运行时PictureBox动画冻结
- python - 使用 end=' ' 打印,格式正确吗?
- amazon-web-services - Amazon Alexa 和 DynamoDB 的日常持久性
- javascript - 如何使用 chrome 扩展获取每个元素的所有事件侦听器
- c# - 无法从另一个表单访问列表框
- javascript - 在 React JS 中,如何在 keyup 事件中将数字转换为逗号分隔值
- java - 任务突发期间应用引擎中止请求错误