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

C++ 如何与其他应用程序共享HGLOBAL?,c++,winapi,shared-memory,C++,Winapi,Shared Memory,我试图了解一些关于全球的事情,因为我刚刚发现我的想法完全是错的 在应用程序A中IGlobalAlloc()数据(带有GMEM_SHARE | GMEM_MOVABLE)并将字符串“Test”放入其中。现在,我可以为另一个应用程序提供什么来获取该数据 我(错误地!)认为HGLOBALs在所有进程中都是有效的,这显然是错误的,因为HGLOBAL是指向全局数据的句柄,而不是指向全局数据的指针(这就是我说的“OHHHH!”) 那么如何将HGLOBAL传递给另一个应用程序呢 注意:我只想传递一个指向数据的

我试图了解一些关于全球的事情,因为我刚刚发现我的想法完全是错的

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

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

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

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

非常感谢!:-)

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

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

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


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

不要与
GMEM\u SHARE
标志混淆。它不像你想象的那样工作。发件人:

以下值已过时,但提供这些值是为了兼容性 具有16位窗口。他们被忽视了

GMEM_SHARE
:

在16位窗口中,GMEM_共享标志控制内存 应该比分配它的流程更有效


要与另一个进程/应用程序共享内存,您应该查看:。

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

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

(这只是一条很长的注释,因为其他人已经解释过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
的内容,但它们被定义为空字符串,因为在展开模式中,仅使用指针附近的字符串。

您可以先阅读windows上的IPC。
HGLOBAL
是16位窗口的保留。他们再也没有什么“全球性”了。