我想了解一些有关HGLOBAL
S,因为我刚刚发现我的想法是完全错误的。
在应用AI GlobalAlloc()
数据(与GMEM_SHARE|GMEM_MOVABLE
),将字符串"Test"
在里面。 现在,我可以给其他应用程序获得该数据?
我虽然(错误地!)那HGLOBAL
s为在所有的进程,这显然是错误的有效的,因为HGLOBAL
是一个HANDLE
到全局数据,而不是指向全局数据(这就是我说的“天上!”)。
那么,如何可以通过HGLOBAL
到另一个应用程序?
注意:我想通过只是一个“指针”的数据,而不是数据本身,像在剪贴板上。
非常感谢! :-)
阅读文档。 通过引入32位处理的, GlobalAlloc()
实际上不再分配全局存储器。
要共享与另一个进程的内存块,你可以分配与块GlobalAlloc()
并把它放在剪贴板中,然后让其他进程retreive它。 或者可以使用分配的共享存储器的块CreateFileMapping()
和MapViewOfFile()
来代替。
每一个过程“认为”,它拥有该计算机上可用的全部内存空间。 没有过程可以“看到”另一个进程的内存空间。 因此,通常情况下,没有一个进程商店可以由另一个过程可以看出。
因为可能有必要通过processess之间的信息,某些机制的存在是为了提供此功能。
一种方法是消息传递; 一个进程发出了一个管道消息到另一个,例如,或者一个插座,或者通过Windows消息。
另一个是共享存储器,其中由存储器的给定块提供给两个或多个进程,以使得任何一个进程写入可由他人看到。
不要混淆GMEM_SHARE
标志。 它不工作,你可能认为的方式。 从MSDN :
下面的值是过时的,但提供的兼容16位Windows。 他们被忽略。
GMEM_SHARE
GMEM_SHARE
标志解释雷蒙德陈 :
在16位Windows中,GMEM_SHARE标志控制的记忆是否应该活得比分配它的过程。
为了与另一个进程/应用程序共享内存,你应该改为看一看文件映射 : 内存映射文件以及它们如何工作 。
(这只是因为别人已经解释的Win32采取不同的方法来内存共享一个很长的评论。)
我要说的是,你正在阅读到Windows上编程的书籍(或教程),这是很老的和过时的Win16的是在相当一段时间几乎死了。
16位Windows(3.X)不具有的存储器隔离(或虚拟/平板/地址空间)的32位(和更高)的Windows版本提供的概念。 内存有曾经被分为本地(以过程)和全球的部分,都生活在同一个全局地址空间。 像描述符HGLOBAL
被用来支持内存块在物理内存中到处移动,尽管在地址空间中的新位置仍能正常访问(正确固定后LocalLock()
/ GlobalLock()
Win32使用指针,而不是因为物理内存页面,而不在虚拟地址空间影响了他们的位置移动。 它仍然提供了所有的Global*
和Local*
API功能兼容性的原因,但他们不应该再使用和往常一样堆管理,而应使用(如malloc()
在C或在new
的C ++运算符)。 也有几个不同类型的指针,以反映在x86提供的几种不同的寻址模式对Win16的存在 - 附近(同一网段),远(段:偏移量)和巨大(标准化段:偏移量)。 你仍然可以看到像FARPTR
在传统的Win16代码,得到移植到Win32的,但它们被定义为平板模式仅在附近使用的指针是空字符串。