我正在尝试了解HGLOBAL
的某些内容,因为我发现我认为这是错误的。
在应用A中我GlobalAlloc()
数据(GMEM_SHARE|GMEM_MOVABLE
)并将字符串"Test"
放入其中。现在,我可以向另一个应用程序提供什么来获取该数据?
我虽然(错误地!)HGLOBAL
在所有进程中都有效,这显然是错误的,因为HGLOBAL
是全局数据的HANDLE
,而不是指针全球数据(这就是我所说的“OHHHH!”)。
那么如何将HGLOBAL
传递给另一个应用程序?
注意:我想只传递一个“指针”指向数据,而不是数据本身,就像在剪贴板中一样。
非常感谢! : - )
答案 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 Mappings:Memory-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()
来分配共享内存块。