Laden...

Truetype-Font laden

Letzter Beitrag vor 15 Jahren 4 Posts 3.316 Views
Truetype-Font laden

Hi,

ich versuche in einem Programm von mir einen mitgelieferten Truetype-Font zu laden und verwenden. Ich habe per Google Code dafür gefunden und für mich angepasst. Bei 80% der Nutzer (inklusive mir) funktioniert es auch, aber die anderen 20% berichten eben von Fehlern. Ich habe leider zu wenig Information um irgendeine Verbindung zwischen allen, bei denen es nicht funktioniert zu finden. Nach eigenen Angaben verwenden alle das aktuelle .net-Framework.

Der Code, den ich verwende ist:


            PrivateFontCollection pfc = new PrivateFontCollection();
            // Die TTF-DAtei "RINGM___.TTF" ist dem Projekt als resource hinzugefügt
            byte[] fontdata = LotroSignatures.Properties.Resources.RINGM___;
            IntPtr data = Marshal.AllocCoTaskMem(fontdata.Length);
            Marshal.Copy(fontdata, 0, data, fontdata.Length);
            pfc.AddMemoryFont(data, fontdata.Length);

            ringbearer = (FontFamily)pfc.Families.GetValue(0);
            font12 = new Font(ringbearer, 12);
            font16 = new Font(ringbearer, 16);
            font18 = new Font(ringbearer, 18);

Der Fehler, den manche erhalten:

System.AccessViolationException: Attempted to read or write protected memory. This is often an indication that other memory is corrupt.
at System.Drawing.SafeNativeMethods.Gdip.GdipDrawStri ng(HandleRef graphics, String textString, Int32 length, HandleRef font, GPRECTF& layoutRect, HandleRef stringFormat, HandleRef brush)
at System.Drawing.Graphics.DrawString(String s, Font font, Brush brush, RectangleF layoutRectangle, StringFormat format)
at System.Drawing.Graphics.DrawString(String s, Font font, Brush brush, Single x, Single y)
at LotroSignatures.MainForm.DrawStringWithOutline(Gra phics g, String str, Font font, Brush outline, Brush foreground, Int32 x, Int32 y)
at LotroSignatures.MainForm.CreateImage()
...

Das passiert dann an einer Stelle, wo ich die oben in Membervariablen gespeicherten Fonts verwende:

g.DrawString(str, font, outline, i, j);

Wir leben zwar alle unter demselben Himmel, haben aber deswegen lange noch nicht alle denselben Horizont.

Gibst du denn den Speicher auch mittels "Marshal.FreeCoTaskMem(data);" wieder frei?

Gibst du denn den Speicher auch mittels "Marshal.FreeCoTaskMem(data);" wieder frei?

Eigentlich ja, ich hatte nur den Befehl mittlerweile mal rausgenommen - ich dachte, eigentlich brauch ich diese Daten ja noch. Aber macht keinen Unterschied.

Wir leben zwar alle unter demselben Himmel, haben aber deswegen lange noch nicht alle denselben Horizont.

Ansonsten sehe ich jetzt so erst mal keinen weiteren Fehler.
Benutzt du denn evtl. Unmanaged Code, so daß du Speicher überschreibst?

Dass du den Fehler nicht nachvollziehen kannst, macht die Fehlersuche um so schwieriger...