来自Marshal.AllocHGlobal
的msdn文档:
allochglobal是marshal类中的两个内存分配方法之一。此方法公开kernel32.dll中的win32 localalloc函数。
考虑到有一个globalalloc api在全局堆而不是本地堆上分配内存,这个方法的名字是不是有点误导?
是否有理由将其命名为AllocHGlobal
,而不是AllocHLocal
?
更新:simon在评论中指出,windows中不再有全局堆,而GlobalAlloc
和LocalAlloc
api只用于遗留用途。现在,GlobalAlloc
api只不过是LocalAlloc
的包装器。
这就解释了为什么api根本不调用GlobalAlloc
,但它不能解释为什么api在不使用(不能)全局堆的情况下被命名为AllocHGlobal
,甚至也不能调用GlobalAlloc
。命名不可能是因为遗留的原因,因为它是在.NET2.0之前才引入的,这是在16位支持被放弃之后。所以,问题仍然是:为什么Marshal.AllocHGlobal
的命名如此误导?
最佳答案
假设您正在应用程序之间使用拖放或通过剪贴板进行数据传输。要填充STGMEDIUM
结构,需要一个HGLOBAL
。所以你打电话给AllocHGlobal
。因此得名。
此函数的主要用途是与需要HGLOBAL
的api交互。如果它被称为其他任何东西,那将是令人困惑的,因为当您想要一个HGLOBAL
时,您必须找到一些文档来告诉您AllocAnythingElse
产生了一个可以用作HGLOBAL
的值。