如何与其他应用程序共享HGLOBAL?

时间:2012-09-27 10:36:01

标签: c++ winapi shared-memory

我正在尝试了解HGLOBAL的某些内容,因为我发现我认为这是错误的。

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

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

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

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

非常感谢! : - )

4 个答案:

答案 0 :(得分:2)

每个进程“认为”它拥有计算机上可用的完整内存空间。没有进程可以“看到”另一个进程的内存空间。因此,通常情况下,其他流程无法看到流程存储。

因为可能需要在Processess之间传递信息,所以存在某些机制来提供此功能。

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

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

答案 1 :(得分:2)

不要与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

答案 2 :(得分:1)

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

我会说你正在阅读有关Windows编程的书籍(或教程),因为Win16在很长一段时间内几乎已经死了,所以它已经过时而且已经过时了。

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

答案 3 :(得分:0)

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

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