Note that there are some explanatory texts on larger screens.

plurals
  1. POUsing a method to get Embedded Font Causes Protected Memory Error
    primarykey
    data
    text
    <p>I am using this code to get an embedded font:</p> <pre><code>/// &lt;summary&gt; /// Returns an Embedded Font /// &lt;/summary&gt; /// &lt;param name="ImagePath"&gt;String begins with namespace e.g MyProgram.Image.png&lt;/param&gt; /// &lt;returns&gt;&lt;/returns&gt; public static Font GetEmbeddedFont(string FontPath, float Size) { Font _font = null; Thread getFontThread = new Thread(() =&gt; GetFont(FontPath, Size, out _font)); getFontThread.Start(); getFontThread.Join(); return _font; } #region GetFont private static void GetFont(string FontPath, float Size, out Font FontOut) { Font fnt = null; Assembly asm = Assembly.GetExecutingAssembly(); Stream resStream = asm.GetManifestResourceStream(FontPath); if (null != resStream) { // // GDI+ wants a pointer to memory, GDI wants the memory. // We will make them both happy. // // First read the font into a buffer byte[] rgbyt = new Byte[resStream.Length]; resStream.Read(rgbyt, 0, rgbyt.Length); resStream.Close(); // Then do the unmanaged font (Windows 2000 and later) // The reason this works is that GDI+ will create a font object for // controls like the RichTextBox and this call will make sure that GDI // recognizes the font name, later. uint cFonts; AddFontMemResourceEx(rgbyt, rgbyt.Length, IntPtr.Zero, out cFonts); // Now do the managed font IntPtr pbyt = Marshal.AllocCoTaskMem(rgbyt.Length); if (null != pbyt) { Marshal.Copy(rgbyt, 0, pbyt, rgbyt.Length); m_pfc = new PrivateFontCollection(); m_pfc.AddMemoryFont(pbyt, rgbyt.Length); Marshal.FreeCoTaskMem(pbyt); } } if (m_pfc.Families.Length &gt; 0) { // Handy how one of the Font constructors takes a // FontFamily object, huh? :-) fnt = new Font(m_pfc.Families[0], Size); } m_pfc.Dispose(); FontOut = fnt; } </code></pre> <p>I use a Thread to attempt to wait for it to finish, because the error seems to occur, if this method is called multiple times within a short space of time.</p> <p>How can I stop this error occuring, I think it has something to do with the method being called within quick succession of each other.</p> <p>I get the exception here:</p> <pre><code>_font = value; using (Graphics g = _parent.CreateGraphics()) { SizeF soize = g.MeasureString(_text, _font); _size = new Size((int)soize.Width, (int)soize.Height); _width = _size.Width; _height = _size.Height; } </code></pre> <p>On the line g.MeasureString(_text, _font);</p> <p>However I know that the error is in the GetEmbeddedFont Method, as it only throws an error if the font is set using the GetEmbeddedFont method.</p> <p>It will work fine once, but if it is used a second time to shortly after the first, it will throw the error.</p> <p>And if I debug the code, _font returns this:</p> <pre><code>{Name = '((System.Drawing.Font)(_font)).fontFamily.Name' threw an exception of type 'System.ArgumentException' Size=15.0} </code></pre>
    singulars
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload