我目前正在开发一个项目,我已经将DLL编写为Windows驱动程序和MATLAB之间的接口。所有这一切都运行得很好,但直到最近还缺少的一件事是某些功能的文档 - 基本上它允许将命令字符串发送到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接口,但在内部它是C ++,因为我一直在使用其他部分的类。我不介意使用哪个,只要它与C接口兼容。
答案 0 :(得分:0)
我暂时离开这个问题,因为它并不紧急,但在过去的几周里又回到了它。我发现我需要为DLL添加更多设置和可配置的东西,这使我以前使用的方法绝对不可用。
基本上,正如@PhilWilliams在评论中建议的那样,我已经开始使用XML文件来配置所有内容。现在有一些API在加载库之后必须被调用,并且要指定要加载的XML文件的位置。然后,DLL将解析XML文件并填充大量内部结构。我现在有一个结构数组,而不是使用#define和常量字符串,其中指向已解析字符串的指针以及之前为#defines的索引。
在查看StackOverflow并找到关于简单XML解析器的各种建议之后,我已经选择了TinyXML2,因为这意味着我没有为许多文档字符串分配和释放内存,因为它在内部处理它。 / p>