元帅FreeHGlobal COMException

新成员
已加入
2014年1月6日
留言内容
1
编程经验
5-10
大家好,

我是C#的新手(来自VB.NET背景)。我必须编辑以前人留下的一些代码,并且遇到了COMException错误,释放了内存。我已经包括了下面的完整功能和错误的屏幕截图。任何帮助,将不胜感激。

2014年6月1日13-01-09.png

C#:
public static Size CalculateTextExtent(string text, Font font, int maximumWidth, Graphics graphics, out int maximumCharactersThatFit, out int[] stringWidths)        {
            maximumCharactersThatFit = 0;
            stringWidths = new int[0];


            if ((text == null) || (text.Length == 0)) return Size.Empty;


            IntPtr tmp_oHdc = graphics.GetHdc();
            IntPtr tmp_oFont = font.ToHfont();
            IntPtr tmp_oPrevSelectedFont = NativeMethods.SelectObject(tmp_oHdc, tmp_oFont);


            NativeMethods.SIZE tmp_oSIZE = new NativeMethods.SIZE(0, 0);
            IntPtr tmp_oStringWidthsArray = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(int))* text.Length);
            Int16 tmp_iMaxCharsTatFit = 0;
            try
            {
                NativeMethods.GetTextExtentExPoint(
                    tmp_oHdc,
                    text,
                    text.Length,
                    maximumWidth,
                    ref tmp_iMaxCharsTatFit,
                    tmp_oStringWidthsArray,
                    ref tmp_oSIZE);
            }
            finally
            {
                NativeMethods.SelectObject(tmp_oHdc, tmp_oPrevSelectedFont);
                NativeMethods.DeleteObject(tmp_oFont);
                graphics.ReleaseHdc(tmp_oHdc);
            }


            maximumCharactersThatFit = tmp_iMaxCharsTatFit;
            Size tmp_oResultSize = new Size(tmp_oSIZE.cx, tmp_oSIZE.cy);
            stringWidths = new int[maximumCharactersThatFit];
            Marshal.Copy(tmp_oStringWidthsArray, stringWidths, 0, stringWidths.Length);
            Marshal.FreeHGlobal(tmp_oStringWidthsArray);


            return tmp_oResultSize;
        }
 

菜鸟

成员
已加入
2013年12月19日
留言内容
7
编程经验
3-5
很难说。那根本不是newb友好的代码。它正在调用本机c ++函数。可能是您的平台不受支持。
Marshal.FreeHGlobal方法(System.Runtime.InteropServices)
Platforms


Windows 8.1,Windows Server 2012 R2,Windows 8,Windows Server 2012,Windows 7,Windows Vista SP2,Windows Server 2008(不支持服务器核心角色),Windows Server 2008 R2(SP1或更高版本支持服务器核心角色;不支持Itanium )

如果您认为它应该在您的平台上运行。尝试在try块中添加一个catch并打印任何结果。

C#:
try {
    ...the same code
} 

// add this. 
catch (Exception e) {
    Console.WriteLine(e.ToString() + "\n" + e.Message);
}

finally {
   ..same code
}

或者只是将try finally块注释掉,看看是否抛出了其他异常。

当您尝试释放由分配的内存时,您将得到一个例外。
Marshal.AllocHGlobal(Marshal.SizeOf(typeof(int))* text.Length);

正确的代码可能是
Marshal.AllocHGlobal(Marshal.SizeOf(Marshal.SystemDefaultCharSize * text.Length);

但是int在任何平台上都应该足够大,因为int(4)的大小大于char(2)的大小

我会尝试使用其他方式分配和释放内存。我对c#中的动态内存分配不熟悉。这不是典型的C#处理方式。
另外,我还不完全了解代码的功能,但是由于没有其他人在回答,所以我认为我会加以破解。也许我说的话会为您指明正确的方向
 
最佳 底部