【问题标题】:Sharing array between two processes两个进程之间共享数组
【发布时间】:2013-09-05 01:00:48
【问题描述】:

我有一个需要在两个进程之间共享的数组。第一个进程有一个注入的 DLL,它不断地获取一些对象的信息,第二个进程需要接收这些信息。我不断地更新这个数组(对象中的数据变化很大),而其他进程需要不断地接收这些更新。我见过人们使用共享内存的例子,但我不确定如何使用它来不断更新数组。您可以向我提出任何建议或代码吗?

【问题讨论】:

    标签: c++ arrays winapi memory


    【解决方案1】:

    您可以使用memory mapped file 在多个进程之间共享您的数组。

    【讨论】:

    • 我见过那个解决方案,但看起来更新该文件上的数据可能很慢。我很快更新了数组数据。不断更新文件不会很慢吗?
    • 一般情况下,文件 I/O 缓存在 MMF 中以提高系统性能。对阵列的更新写入 RAM,不一定是磁盘。
    • 这是一个由 2048 个结构组成的数组,大小约为 32 个字节。如果我真的需要,我可以将该数组缩短到 255 或 64,但这意味着我的程序的功能将被取消。
    • 在目标进程的另一个线程中的while循环中更新。
    • @user1822632:嗯,这是最直接的解决方案,那你试试看它是否适合你?
    【解决方案2】:

    您可以在加载该 DLL 的进程之间共享 DLL 中的数据。有关如何使用 #pragma data_seg 执行此操作的详细信息,请参阅 How do I share data in my DLL with an application or with other DLLs?。因此,如果您将数组存储在 DLL 中并且两个进程都打开 DLL,那么您所需要的只是某种同步(例如互斥锁)来仲裁对数据的共享访问。

    为方便起见,您可能希望在 DLL 中实现导出函数来读取/写入数组数据,而不是导出原始数组本身。

    【讨论】:

    • 由于我正在注入的进程的性质(带有反作弊功能的视频游戏),我不得不以一种实际上不会使其成为 DLL 的方式注入 dll。我将 DLL 用于它的 PE 标头,因此我可以处理重新定位所有内容并导入可能存在的依赖项。然后我将减去PE头的dll映射到远程进程中,然后执行主线程函数(不是dllmain,因为dllmain也只执行了主线程)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-03
    • 1970-01-01
    • 1970-01-01
    • 2018-07-06
    • 2014-09-02
    • 2010-11-15
    • 2011-01-18
    相关资源
    最近更新 更多