【问题标题】:How to share HGLOBAL with another application?如何与另一个应用程序共享 HGLOBAL?
【发布时间】:2012-09-19 02:58:21
【问题描述】:

我试图了解有关HGLOBALs 的一些信息,因为我刚刚发现我的想法完全是错误的。

在应用程序 A I GlobalAlloc() 数据(带有 GMEM_SHARE|GMEM_MOVABLE)并将字符串 "Test" 放入其中。现在,我可以为另一个应用程序提供什么来获取该数据?

我虽然(错误地!)HGLOBALs 在所有进程中都有效,这显然是错误的,因为HGLOBAL 是指向全局数据的HANDLE,而不是指向全局数据的指针(即我说“OHHHH!”)。

那么如何将HGLOBAL 传递给另一个应用程序?

注意:我只想传递一个指向数据的“指针”,而不是数据本身,就像在剪贴板中一样。

非常感谢! :-)

【问题讨论】:

  • 您可以先阅读有关 Windows 上的 IPC。
  • HGLOBAL 是 16 位 Windows 的保留。它们不再是“全球性”的了。

标签: c++ winapi shared-memory


【解决方案1】:

(这只是一个很长的评论,因为其他人已经解释过 Win32 采用不同的方法来共享内存。)

我会说您正在阅读有关 Windows 编程的书籍(或教程),这些书籍(或教程)已经相当陈旧且过时了,因为 Win16 几乎已经消亡了相当长的一段时间。

16 位 Windows (3.x) 没有 32 位(及更高版本)Windows 版本提供的内存隔离(或虚拟/平面/地址空间)的概念。那里的内存过去被分为本地(进程)和全局部分,两者都生活在同一个全局地址空间中。像HGLOBAL 这样的描述符被用来允许内存块在物理内存中移动,并且尽管它们在地址空间中的新位置仍然可以正确访问(在使用LocalLock()/GlobalLock() 正确固定之后)。 Win32 使用指针代替,因为可以移动物理内存页面而不影响它们在虚拟地址空间中的位置。出于兼容性原因,它仍然提供所有 Global*Local* API 函数,但不应再使用它们,而应使用通常的堆管理(例如 C 中的 malloc() 或 C++ 中的 new 运算符)。 Win16 上还存在几种不同类型的指针,以反映 x86 上可用的几种不同寻址模式 - 近(同一段)、远(段:偏移)和巨大(标准化段:偏移)。您仍然可以在移植到 Win32 的旧版 Win16 代码中看到类似 FARPTR 的内容,但它们被定义为空字符串,因为在平面模式下仅使用指针附近的指针。

【讨论】:

    【解决方案2】:

    阅读文档。随着 32 位处理的引入,GlobalAlloc() 实际上不再分配全局内存。

    要与另一个进程共享内存块,您可以使用GlobalAlloc() 分配该块并将其放在剪贴板上,然后让其他进程检索它。或者您可以使用CreateFileMapping()MapViewOfFile() 来分配一块共享内存。

    【讨论】:

      【解决方案3】:

      每个进程“认为”它拥有计算机上可用的全部内存空间。没有进程可以“看到”另一个进程的内存空间。因此,通常情况下,一个进程存储的任何内容都不会被另一个进程看到。

      由于可能需要在进程之间传递信息,因此存在某些机制来提供此功能。

      一种方法是消息传递;一个进程向另一个进程发出消息,例如通过管道、套接字或 Windows 消息。

      另一个是共享内存,其中一个给定的内存块可供两个或多个进程使用,这样一个进程写入的任何内容都可以被其他进程看到。

      【讨论】:

        【解决方案4】:

        不要与GMEM_SHARE 标志混淆。它不像你想象的那样工作。来自MSDN

        以下值已过时,但为了兼容性而提供 使用 16 位 Windows。它们被忽略了。

        GMEM_SHARE
        

        GMEM_SHARE flag explained by Raymond Chen

        在 16 位 Windows 中,GMEM_SHARE 标志控制内存是否 应该比分配它的进程寿命更长。

        要与另一个进程/应用程序共享内存,您应该查看File MappingsMemory-mapped files and how they work

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-02-15
          • 1970-01-01
          • 2015-11-26
          • 1970-01-01
          相关资源
          最近更新 更多