如何将配置文件嵌入 C++ VS2015 控制台应用程序而不是硬编码为常量数据?

How to embed config files in C++ VS2015 console application instead of hard-code as const data?

有很多关于简单地将其保存为 const 数据或将其转换为二进制数据但没有详细信息的答案。

我看过这个:How to embed a file into an executable?

我不喜欢将配置文件转换为常量数据。

如何在编译时将配置文件嵌入到 exe 中,但不在 exe 旁边

需要详细步骤。

谢谢。

您必须手动添加设置,因为 visual studio 不知道如何自动处理配置文件。如果我们不手动执行,配置文件将不会复制到输出目录。

转到项目属性 -> 配置属性 -> 构建事件 -> post 构建事件 并更改命令行:

复制app.config"$(TargetPath).config"

之后您必须添加来自 system.configuration 的新引用。在 project properties -> common properties -> references -> add new reference -> .net -> system.configuraion

中找到

然后从 project -> new -> configuration file

创建你的配置文件

我了解到您想创建用于存储配置的自修改 exe 文件。作为一个简单的答案,如果不破解页面保护,您将无法实现。

Here and here 你可以找到一些有用的信息。

一种Windows特定的方法是将配置文件作为资源嵌入到可执行文件中:

  • 在某个头文件中为资源定义标识符,比如 resource.h:

    #define CONFIG_FILE_RESOURCE_ID 1
    
  • 将 .rc 文件添加到您的项目中,其中包含以下行:

    #include "resource.h"
    CONFIG_FILE_RESOURCE_ID RCDATA "config.txt"
    

    其中 config.txt 是将要嵌入的文件的名称。 RCDATA 是资源类型(自定义二进制数据)。

    或者,如果您的 Visual Studio 版本带有 资源编辑器,你可以使用它。

  • 要从您的程序中读取资源,您必须:

    1. 调用 FindResource(NULL, MAKEINTRESOURCE(CONFIG_FILE_RESOURCE_ID), RT_RCDATA) 获取资源句柄。
    2. 调用LoadResource(NULL, hrsrc)将资源句柄hrsrc转换为HGLOBAL
    3. 使用LockResourceSizeofResource函数获取指向数据的指针和嵌入文件的大小。

    您可能必须提供实际的 module/instance 句柄而不是 NULL,尤其是当您的代码位于 DLL 中时。