来自Marshal.AllocHGlobal的msdn文档:
allochglobal是marshal类中的两个内存分配方法之一。此方法公开kernel32.dll中的win32 localalloc函数。
考虑到有一个globalalloc api在全局堆而不是本地堆上分配内存,这个方法的名字是不是有点误导?
是否有理由将其命名为AllocHGlobal,而不是AllocHLocal
更新:simon在评论中指出,windows中不再有全局堆,而GlobalAllocLocalAllocapi只用于遗留用途。现在,GlobalAllocapi只不过是LocalAlloc的包装器。
这就解释了为什么api根本不调用GlobalAlloc,但它不能解释为什么api在不使用(不能)全局堆的情况下被命名为AllocHGlobal,甚至也不能调用GlobalAlloc。命名不可能是因为遗留的原因,因为它是在.NET2.0之前才引入的,这是在16位支持被放弃之后。所以,问题仍然是:为什么Marshal.AllocHGlobal的命名如此误导?

最佳答案

假设您正在应用程序之间使用拖放或通过剪贴板进行数据传输。要填充STGMEDIUM结构,需要一个HGLOBAL。所以你打电话给AllocHGlobal。因此得名。
此函数的主要用途是与需要HGLOBAL的api交互。如果它被称为其他任何东西,那将是令人困惑的,因为当您想要一个HGLOBAL时,您必须找到一些文档来告诉您AllocAnythingElse产生了一个可以用作HGLOBAL的值。

07-28 01:34