C++ Windows DLL使用文件初始化常量c字符串数组 背景

C++ Windows DLL使用文件初始化常量c字符串数组 背景,c++,c,windows,dll,C++,C,Windows,Dll,我目前正在从事一个项目,为此我编写了一个DLL作为Windows驱动程序和MATLAB之间的接口。所有这些都工作得很好,但直到最近它还缺少关于某些功能的文档——本质上它允许将命令字符串发送到FPGA,所有这些命令都需要文档化 这可以通过使用PDF等来实现,但我还想找到一种方法将文档集成到DLL中,这样就可以使用“lookup command”等函数。不管怎样,我还是以一种我最满意的方式去实施它 基本上,我有一个结构(见下文),可以从函数返回指针,以便访问文档。调用者提供指向其中一个的指针地址,然

我目前正在从事一个项目,为此我编写了一个DLL作为Windows驱动程序和MATLAB之间的接口。所有这些都工作得很好,但直到最近它还缺少关于某些功能的文档——本质上它允许将命令字符串发送到FPGA,所有这些命令都需要文档化

这可以通过使用PDF等来实现,但我还想找到一种方法将文档集成到DLL中,这样就可以使用“lookup command”等函数。不管怎样,我还是以一种我最满意的方式去实施它

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

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接口,但内部是C++,因为我已经使用了其他部分的类。只要它与C接口兼容,我就不介意使用哪一个。

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

基本上正如@Phillwilliams在评论中所建议的那样,我已经开始使用XML文件来配置一切。现在有一些API必须在加载库之后调用,使用库指定要加载的XML文件的位置。DLL随后将解析XML文件并填充一堆内部结构。我现在没有使用#defines和常量字符串,而是使用了一个结构数组,其中指向已解析字符串的指针与以前#defines的索引一起位于该数组中


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

您可以将文档作为资源包含在DLL中。然后可以仅使用资源链接器对其进行更新。但最简单的是一个或多个单独的文件。这些技术可以结合使用,我个人会使用xml或json文件。这样做的好处是,所有需要对文档进行更改的人都是一个文本编辑器。如果您保持文件的简单,那么任何人都应该很容易了解它是如何工作的。