1

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

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

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

那么我怎样才能将它传递HGLOBAL给另一个应用程序呢?

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

非常感谢!:-)

4

4 回答 4

3

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

我会说您正在阅读有关 Windows 编程的书籍(或教程),这些书籍(或教程)非常古老且过时,因为 Win16 几乎已经死了很长一段时间。

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

于 2012-10-01T16:54:56.270 回答
2

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

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

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

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

于 2012-09-27T10:50:23.657 回答
2

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

以下值已过时,但提供这些值是为了与 16 位 Windows 兼容。他们被忽略了。

GMEM_SHARE

GMEM_SHARERaymond Chen 解释的标志

在 16 位 Windows 中,GMEM_SHARE 标志控制内存是否应该超过分配它的进程。

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

于 2012-09-27T10:56:08.383 回答
2

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

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

于 2012-09-27T22:16:28.660 回答