代码之家  ›  专栏  ›  技术社区  ›  David

将exe数据向下传递到一个或多个dll

  •  1
  • David  · 技术社区  · 17 年前

    我们当前的应用程序是一个包含多个页面的opengl exe。exe负责访问通过udp通过网络发送的数据。它收集数据并将其存储在许多单例结构中。exe中的各个页面访问singleton结构,以按其认为合适的方式处理数据。

    为了减轻我们的exe占用空间并支持我们在配置管理方面的尝试,我们决定将页面分割成一个单独的dll,由exe加载。我们的目的是让exe成为加载dll页面的shell。exe仍将承担所有通信责任(udp、corba、用户等)。这些页面仍将负责显示他们所做的一切。

    问题(最后)变成:如何将从exe收集的大量数据传递到使用dll的页面。单重态概念不再成立,因为我们使用的单重态(ace_singleton)不允许这种水平的方向。我们可以一整天从DLL出口到消费EXE,但我还没有找到相反的方法。我已经提出了以下选项——我没有一个喜欢,所以我希望有人能有更好的选择:

    1. 将当前存储在单独单例中的所有数据打包到另一个将导出“真”单例的dll中。从dll导出的singleton将是相同的,不管exe加载了什么,都有点像共享内存。这是一个有趣的选择,但会导致与我们的部署方案相关的问题。如果人们真的被这个想法迷住了,我可以详细讨论这些问题。
    2. 创建包含所有相关数据的静态dll级结构。加载dll时,exe会将此数据下推到dll,以便dll中包含的页可以访问数据。这似乎是最简单的解决方案—即使它需要编辑应用程序中的每个页面—超过100个。看起来也有点草率。所有的数据都是全球性的。不是很性感,也不是C++Y。

    那么,其他人有办法解决这个问题吗?

    应用程序使用Visual C++ 9(VisualStudio 2008)编写,用于WindowsXP上。由于某些原因,我们的实验室还不支持vista,即使我们的客户正在使用它。

    5 回复  |  直到 17 年前
        1
  •  1
  •   MSalters    17 年前

    为所有dll提供一个函数setGlobalDataPointer(singleton*)。您的exe在调用任何其他dll函数之前调用此函数。在dll代码中,替换singleton的所有出现。通过singletonptr->

        2
  •  0
  •   Mike Dimmick    17 年前

    你可以:

    • 把所有的东西都放到一个“公共”dll中;
    • 使用def文件从exe生成导出函数。

    第二种情况很少见,但可以仅从def文件生成导入库。使用lib/def生成导入库。见 Working with Import Libraries and Export Files .

        3
  •  0
  •   darron    17 年前

    不幸的是,听起来你有很多现有的代码需要修改。在这种情况下,我只想用(2),假设它不会变得太大和笨拙。

    根据您的描述,听起来像是在加载dll时只需要发送一次exe级别的数据。

    如果(2)太混乱,我会对它进行一些重构,以便有一个带有serialize/unserialize()函数的基本“dllpage”类。永远不要导出类本身,只导出其中所需的单个函数(随着类的变化,这会非常有帮助……类级导出会出现非常奇怪的中断)。您需要构造函数/析构函数,可能还需要每个公共成员。

    可能存在一些堆管理问题,因此我还希望重载new/delete,并让所有类使用位于helper dll中的集中式new/delete。

        4
  •  0
  •   Torlack    17 年前

    在你开始破坏exe之前,你应该先阅读一下内存管理和dll。

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

    Potential Errors Passing CRT Objects Across DLL Boundaries

        5
  •  0
  •   gbjbaanb    17 年前

    第一个选项:将exe保存的所有数据放入共享内存。DLL可以愉快地访问它,只要你有适当的锁定到位。

    第二个选项:使用导出的函数指针将内存传输到DLL,EXE有一个函数,DLL调用EXE中的另一个函数,该函数将这个函数返回为指针,DLL可以调用该函数。导出函数可以将数据作为正常结构传递到堆栈上。

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