c++ - Windows DLL 用文件初始化常量 c 字符串数组

标签 c++ c windows dll

背景

我目前正在开发一个项目,为该项目编写了一个 DLL 作为 Windows 驱动程序和 MATLAB 之间的接口(interface)。所有这些都运行良好,但直到最近还缺少某些功能的文档 - 本质上它允许将命令字符串发送到 FPGA,并且所有这些命令都需要文档化。

这可以使用 PDF 等来完成,但我还想要一种将文档集成到 DLL 本身中的方法 - 因此可以使用“查找命令”等功能。无论如何,我继续以一种令我满意的方式实现了这一点。

本质上,我有一个结构(见下文),可以从函数返回一个指针,以便可以访问文档。调用者提供指向其中之一的指针的地址,然后使用常量全局数组中的条目的地址进行更新。

typedef struct {
    CONST CHAR * commandString;
    ULONG commandStringLen;
    CONST CHAR * documentationString;
    ULONG documentationStringLen;
    CONST CHAR * commandParameters;
    ULONG commandParametersLen;
} COMMAND_DOCS;

#define STRING_LEN(a) a,(sizeof(a)-1)
#define NEWGROUP  "\n    "
#define NEWENTRY  "\n              "
#define NEWLINE   "\n"
#define ENDTITLE  "\n----------------------------------------\n"

CONST COMMAND_DOCS CommandDocs[] = {
//-----
#define COMMAND_xyz_GROUP_INDEX_START      (0)
        { STRING_LEN("ABCD"), 
          STRING_LEN("Something Command"
                     ENDTITLE"Low Queue"
                     NEWLINE "Description:"
                     NEWGROUP"The .........."
                     NEWLINE), 
          STRING_LEN(NEWGROUP"Type x:"
                     NEWENTRY"No Payload"
                     NEWLINE)
        },
#define COMMAND_xyz_GROUP_LENGTH           (1)
//-----
    ... And so on
};

这会导致在内存中存储大量常量字符串,以及一个文档结构数组,其中包含指向这些常量及其长度的指针,以进行良好的衡量。正如我所说,返回指向数组中所需元素的指针。然后,库 API 的调用者可以根据需要自由制作拷贝或显示字符串,等等。

目前,除了一个小烦恼之外,一切都运行良好。每当我需要更新文档时,都需要我重新编译 DLL - 显然所有字符串都被编译到其中。对我来说,这不是问题,因为我可以轻松编译它,但由于我正在一所大学工作,开发一个研究平台供他们使用,我希望人们在未来更新时能够变得简单,因为我继续其他工作。理想情况下,如果文档需要更新 - 比如说将新命令添加到系统中,我希望无需重新编译即可进行添加。

<小时/>

问题

所以我的问题实际上是关于执行此操作的最佳方法是什么。

目前我正在考虑从文件加载文档,无论是在加载 DLL 时,还是在调用搜索函数时。目前数组中有 #defines 来分隔索引(标识命令组),但这些可以替换为由文件中的数据初始化的变量。

我可以使用 XML 之类的东西并解析它来填充结构,但我的一部分认为,如果它更简单,外界会更容易理解,但我想我仍然需要某种方法识别条目之间的边界等。

想法?

<小时/>

请注意,DLL 大部分是 C 语言 - 所有 API 都是 C 接口(interface),但内部它是 C++,因为我一直在其他部分使用类。我不介意使用哪个,只要兼容C接口(interface)即可。

最佳答案

我暂时离开了这个问题,因为它并不紧急,但在过去几周又回到了这个问题。我发现我需要向 DLL 添加更多设置和可配置内容,这使得我之前使用的方法绝对无法使用。

基本上正如 @PhilWilliams 在评论中建议的那样,我已经选择使用 XML 文件来配置所有内容。现在有一些 API 必须在加载库后立即调用,通过这些 API 指定要加载的 XML 文件的位置。然后,DLL 将解析 XML 文件并填充大量内部结构。我现在不再使用 #defines 和常量字符串,而是拥有一个结构数组,其中指向已解析字符串的指针以及之前 #defines 的索引。

在查看 StackOverflow 并找到有关简单 XML 解析器的各种建议后,我选择了 TinyXML2,因为它意味着我不必为许多文档字符串分配和释放内存而头疼,因为它在内部处理这些内容。

关于c++ - Windows DLL 用文件初始化常量 c 字符串数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30387540/

相关文章:

c++ - 堆栈与堆栈和堆与堆

C++ 空指针

c++ - 问题\如何激活 Elecard Direct Show Decoder 过滤器

c++ - 如果没有未定义的行为 [c++],哪些浮点值不能转换为 int?

Android - 如何在 Windows 上构建 native 库并在 Android NDK 中使用它

c - 为什么以及在何种意义上 pthread_t 是不透明类型?

objective-c - strftime %e 个位数天数之前没有空白?

linux - 如何使用 ffmpeg 从视频中简单地删除重复帧

windows - 不同DPI、高度计算的CComboBoxEx问题

java - 创建安全的java应用程序