微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

将EXE数据传递给一个或多个DLL

我们当前的应用程序是包含多个页面的单个OpenGL EXE。 EXE负责访问通过UDP在networking上发送的数据。 它累积数据并将其存储在一系列单例结构中。 EXE中的单个页面访问单身结构来处理他们认为合适的数据。

为了减轻我们的EXE足迹,并支持我们在configurationpipe理方面的尝试,我们决定将这些页面分成一个EXE加载的DLL。 我们打算让EXE成为从DLL中加载页面的shell。 EXE仍然具有所有的通信责任(UDP,Corba,用户等)。 页面仍将负责显示他们所做的任何事情。

这个问题(最后)变成:我如何将从EXE收集的大量数据传递给耗费的基于DLL的页面。 Singleton概念不再持有水,因为我们使用的单身(ACE_Singleton)不允许这样的方向。 我们可以整天将DLL中的单例从DLL中导出到耗费的EXE中,但是我还没有弄明白。 我已经提出了以下选项 – 我不喜欢这些选项,所以我希望有人会有更好的一个:)

将当前存储在单独单例中的所有数据汇总到另一个将导出“真实”单例的DLL中。 例如。 从DLL导出的单例将是相同的 – 不pipe是什么EXE加载它 – 有点像共享内存。 这是一个有趣的select,但会导致我们的部署scheme出现问题。 如果人们真的被这个想法所打动,我可以详细讨论这些问题。

创build一个包含所有相关数据的静态DLL级别结构。 EXE会在加载DLL时将这些数据下推到DLL中,这样DLL中包含的页面就可以访问数据。 这似乎是最简单的解决scheme – 即使它需要编辑我们的应用程序中的每一个页面 – 超过100个。它也似乎有点草率。 所有的数据只是在全球范围内。 不是很性感或者C ++ y。

那么,其他任何人都有解决这个问题?

如何跟踪使用的DLL(这是所谓的DLL地狱?)

你如何获得一个全局variables被实例化为win32下C ++的第一件事情?

退出无法设置错误代码

停止同步Windows 2008 R2时钟

使用Visual Studio 2008编译的C ++ dll可以用于Visual Studio 2005吗?

该应用程序使用Visual C ++ 9.0(VisualStudio 2008)编写,用于Windows XP。 由于某些原因,Vista在我们的实验室中还不被支持 – 尽pipe我们的客户正在使用它。

为什么我的visual studio 2k8 C ++项目不能使用unicode字符?

什么是named.exe进程以及如何避免消耗高cpu速率

exe文件的大小vs可用内存

有效地等待标志状态改变而不阻塞资源?

build立控制台应用程序没有CRT&标题

给所有的DLL一个函数SetglobalDataPointer(Singleton *)。 在您调用任何其他DLL函数之前,您的EXE调用函数。 在DLL代码中,替换Singleton的所有发生。 由theingletonPtr->

你可以:

把所有的东西放在最外层的shell里面,

使用DEF文件从您的EXE生成导出函数

第二个是非常罕见的,但是可以从DEF文件生成一个导入库。 使用LIB / DEF来生成导入库。 请参阅使用导入库和导出文件

不幸的是,这听起来像你有很多现有的代码修补。 在这种情况下,我只是和(2)一起去,假设它不太大,笨拙。

从你的描述来看,这听起来像EXE级别的数据只需要在DLL加载时发送一次。

如果(2)太乱了,我会重构它有一点与Serialize / UnSerialize()函数的基础“DLLPage”类。 永远不要输出类本身,只输出你需要的单个函数(当类更改时,这会有很大帮助…类级输出会出现非常奇怪的中断)。 您将需要构造函数/析构函数,并可能需要每个公共成员。

可能会有一些堆管理问题,所以我也想重载新/删除,并让所有的类都使用位于助手DLL中的集中的新/删除

在开始尝试打破EXE之前,您应该阅读内存管理和DLL。

这里有一篇讨论CRT对象问题的文章,但是同样的事情适用于你自己的C ++对象。

通过DLL边界传递CRT对象的潜在错误

一个选项:把所有的exe数据保存在共享内存中。 只要你有适当的锁定,dll就可以高兴地访问它。

第二种选择:使用导出的函数指针将内存传输到dll – exe有一个函数,dll调用exe中的另一个函数,该函数将该函数作为指针返回,然后dll可以调用函数。 该导出的函数可以将数据作为堆栈上的普通结构传输。

第三个选项:如果您使用相同的运行时,只需导出一个指针,让您直接访问内存。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐