C++ Windows DLL使用文件初始化常量c字符串数组 背景
我目前正在从事一个项目,为此我编写了一个DLL作为Windows驱动程序和MATLAB之间的接口。所有这些都工作得很好,但直到最近它还缺少关于某些功能的文档——本质上它允许将命令字符串发送到FPGA,所有这些命令都需要文档化 这可以通过使用PDF等来实现,但我还想找到一种方法将文档集成到DLL中,这样就可以使用“lookup command”等函数。不管怎样,我还是以一种我最满意的方式去实施它 基本上,我有一个结构(见下文),可以从函数返回指针,以便访问文档。调用者提供指向其中一个的指针地址,然后使用常量全局数组中的条目地址更新该地址C++ Windows DLL使用文件初始化常量c字符串数组 背景,c++,c,windows,dll,C++,C,Windows,Dll,我目前正在从事一个项目,为此我编写了一个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之类的东西并解析它来填充结构,但我的一部分人认为,如果它更简单的话,在外部世界会更容易理解,但我想我仍然需要某种方法来识别条目之间的边界,等等 想法
在查看了StackOverflow并找到了关于简单XML解析器的各种建议之后,我选择了TinyXML2,因为这意味着我不必为许多文档字符串分配和释放内存,因为它在内部处理这些字符串。您可以将文档作为资源包含在DLL中。然后可以仅使用资源链接器对其进行更新。但最简单的是一个或多个单独的文件。这些技术可以结合使用,我个人会使用xml或json文件。这样做的好处是,所有需要对文档进行更改的人都是一个文本编辑器。如果您保持文件的简单,那么任何人都应该很容易了解它是如何工作的。