日期:2014-05-20  浏览次数:20893 次

MSDN很少涉及的问题,想求教一下。
Marshal.FreeHGlobal的意思?
还有下面这段代码,是用于什么的?
internal static IntPtr ConvertRectangleToMemory(RectangleF[] rect)
{
    if (rect == null)
    {
        throw new ArgumentNullException("rect");
    }
    GPRECTF gPRECTF = default(GPRECTF);
    int j = Marshal.SizeOf(gPRECTF.GetType());
    int k = rect.Length;
    IntPtr intPtr = Marshal.AllocHGlobal(k * j);
    for (int i = 0; i < k; i++)
    {
        Marshal.StructureToPtr(new GPRECTF(rect[i]), (IntPtr)((long)intPtr + i * j), false);
    }
    return intPtr;
}

------解决方案--------------------
窗口句柄?画图的?
------解决方案--------------------
Marshal.FreeHGlobal 方法 

释放以前从进程的非托管内存中分配的内存。

==>官方的解释,
具体不懂呢,
你是不是调用其它语言写的 dll
------解决方案--------------------
自定义消息,或从c#中直接调用 某些消息传送数据时使用, 使用前,获取非托管的句柄,使用后,释放 
------解决方案--------------------
引用:
我也大概理解成这样,“自定义消息”是什么意思?能解释下吗?还有最好弄几个应用实例看看,还有能用这个的好处,还有不用此类的替代方法,并评价下用与不用的优劣。

自定义消息就是WM_USER+1 一般都是这样写的。


Marshal.FreeHGlobal 方法  

释放以前从进程的非托管内存中分配的内存。
这个主要是用在你使用别人函数你传进去是参数。而返回是指针。
这时这个指针,在别人的程序里没有办法释放。需要你手动释放。就需要用到这个了。

------解决方案--------------------
可使用 FreeHGlobal 从全局堆释放由 AllocHGlobal、ReAllocHGlobal 或任何等效非托管 API 方法分配的内存。如果 hglobal 参数为 IntPtr.Zero,则此方法什么也不做。 
你可以使用 这个API 分配内存

HGLOBAL WINAPI GlobalAlloc(
  __in  UINT uFlags,
  __in  SIZE_T dwBytes
);


然后 调用Marshal.FreeHGlobal释放,不然就内存泄漏了。。。。
------解决方案--------------------
这段代码在全局堆上分配内存之后把需要列集的数据复制到可供非托管函数访问的固定内存
别的列集方法还有COM、pinvoke、C++interop等等
------解决方案--------------------
引用:
十分感谢大家的帮助 ,我更加深入理解了,还有一个里面的问题我搞不清楚。
http://reflector.webtropy.com/default.aspx/Net/Net/3@5@50727@3053/DEVDIV/depot/DevDiv/releases/whidbey/netfxsp/ndp/fx/src/CommonUI/System/Drawing/Advanced/GPRECTF……

平台调用,互相封送数据相关

------解决方案--------------------
图形api经常使用rect这个结构