我有一个用C++
编写的读者DLL。
我也有用某种语言编写的编写器DLL(不是在C++
中)。
DLL同步在同一进程中运行。
GetData
DLL共享数据的推荐方法是什么?
Reader DLL将文件路径参数传递给Writer DLL并从文件中读取数据。
我想避免将数据写入磁盘。即使它是最强大的解决方案,我也想探索不同的选项,因为当你不需要在磁盘上将数据写入磁盘时,我似乎并不优雅。
Writer DLL将在堆上分配缓冲区并将地址和大小返回给读取器DLL。
Reader DLL必须释放内存。这可行吗?按地址和大小删除内存?
此外,它可能是跨模块/语言的一个很大的NO-NO分配和释放缓冲区
将GetData()分为两个调用。
这是可接受的WINAPI方法。
我假设Writer DLL能够在写入之前知道数据的大小,但情况并非总是如此。
使用Windows文件映射
方法2和3的类似缺点。
DLL都在相同的进程和地址空间中运行。因此,他们可以直接在内存中共享任何数据。挑战只是如何提供对数据的访问,特别是如果您使用不同的语言。
对于使用复杂数据结构跳过语言障碍,字符串变体似乎是一个简单的选择。几乎每种语言都有字符串。生产者可以在不必事先知道数据大小的情况下构建其字符串。最后,即使字符串在语言中的管理方式不同,也总是有一个way to access them in read-only。
但我的首选变体是组织整个事情,编写器(或作为中介的主程序)根据需要调用读取器的处理函数(当部分数据可用时),提供数据作为参数定义良好的函数调用类型。
注意:由于我们正在讨论在两种不同语言之间传递数据,我将假设我们正在讨论“原始”数据(原始类型,POD和co。),它们不需要对销毁进行任何特殊处理;如果不是这样,请在评论中告诉我。
LocalAlloc
/ LocalFree
(或其他Win32 API提供的堆原语),因为它们在逻辑上“低于”所有用户模式代码,并提供可用于所有模块的共享堆。当前进程;所以,一方知道它必须使用LocalAlloc
进行分配,另一方知道必须使用LocalFree
解除分配这些数据;一切正常;
分配模块还为其分配的内存提供解除分配功能;客户端代码知道模块A
分配的任何内容都必须使用A_free()
函数释放。这反过来可能只包装您的语言释放函数,以用作您在“业务逻辑”导出函数中执行的分配的对应部分。顺便说一句,有一个A_malloc()
也可能有用来标记预期由A_free()
释放的分配 - 即使它们今天可能是普通的malloc
/ free
,你可能有兴趣稍后更改它。LocalAlloc
/ LocalFree
解决方案更加繁琐,没有特别的收益,所以我不会打扰。就个人而言,我选择了2 - 它实现起来很简单,并且不需要对你在C中编写这些东西的方式进行大的改动 - 唯一的区别是你必须使用一对特定的分配/释放函数。使用这些数据。
想到一个额外的可能性是让你的函数将分配函数作为回调参数(并且可能还有dellocation函数参数,如果你的算法需要它 - 动态增长的数组会浮现在脑海中);它将是调用者提供它,因此被调用的DLL将分配调用者最喜欢的任何堆。