gpt4 book ai didi

c++ - 如何与另一个应用程序共享 HGLOBAL?

转载 作者:行者123 更新时间:2023-11-30 01:25:15 25 4
gpt4 key购买 nike

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

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

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

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

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

非常感谢! :-)

最佳答案

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

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

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

关于c++ - 如何与另一个应用程序共享 HGLOBAL?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12619430/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com