.net - 字型指定的編碼cmap遺失 - 無法找到或建立字型pdf



嵌入字體導致崩潰 (1)

        Marshal.FreeCoTaskMem(FontPtr)

PrivateFontCollection的MSDN文檔對此太鈍了。 但是你需要保持添加的字體有效的內存,直到你不能再使用字體。 或者換一種說法,AddMemoryFont()不會製作字體的副本。 所以當你的程序試圖訪問字體數據時,它會被一個神秘的GDI +錯誤翻倒,並被另一個非託管內存分配覆蓋。

將FreeCoTaskMem()調用移動到FormClosed事件處理程序。 或者,如果關閉表單也會終止您的程序,請不要打擾。

我有一個WinForm應用程序。 我正在使用我的嵌入式資源中的自定義字體。
它起初工作,但是會導致程序在一段時間後崩潰。
使用下面的代碼作為例子,如果我不斷調整窗體大小,迫使它不斷重繪自己,它會在幾秒鐘內崩潰。 我得到的消息是Error in 'Form1_Paint()'. Object is currently in use elsewhere.Error in 'Form1_Paint()'. Object is currently in use elsewhere. Error in 'Form1_Paint()'. Object is currently in use elsewhere. “。
我究竟做錯了什麼? 我怎樣才能避免這一點?
我從這裡得到了字體
謝謝。

Imports System.Drawing.Text
Imports System.Runtime.InteropServices

Public Class Form1
    Friend Harabara As Font

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        LoadFonts()
    End Sub

    Private Sub Form1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles Me.Paint
        Try
            e.Graphics.DrawString("This was drawn using the custom font 'Harabara'", Harabara, Brushes.Lime, 10.0F, 10.0F)
        Catch ex As Exception
            MsgBox("Error in Form1_Paint()'" & vbCrLf & ex.Message)
        End Try
    End Sub

    Public Sub LoadFonts()
        Try
            Harabara = GetFontInstance(My.Resources.HarabaraHand, 24.0F, FontStyle.Italic)
        Catch ex As Exception
            MsgBox("Error in 'LoadFonts()'" & vbCrLf & ex.Message)
        End Try
    End Sub

    Private Function GetFontInstance(ByVal data() As Byte, ByVal Size As Single, ByVal Style As FontStyle) As Font
        Dim result As Font
        Try
            Dim pfc = New PrivateFontCollection
            'LOAD MEMORY POINTER FOR FONT RESOURCE
            Dim FontPtr As System.IntPtr = Marshal.AllocCoTaskMem(data.Length)
            'COPY THE DATA TO THE MEMORY LOCATION
            Marshal.Copy(data, 0, FontPtr, data.Length)
            'LOAD THE MEMORY FONT INTO THE PRIVATE FONT COLLECTION
            pfc.AddMemoryFont(FontPtr, data.Length)
            'FREE UNSAFE MEMORY
            Marshal.FreeCoTaskMem(FontPtr)

            result = New Font(pfc.Families(0), Size, Style)
            pfc.Families(0).Dispose()
            pfc.Dispose()
        Catch ex As Exception
            'ERROR LOADING FONT. HANDLE EXCEPTION HERE
            MsgBox("Error in 'GetFontInstance()'" & vbCrLf & ex.Message)
            result = New Font(FontFamily.GenericMonospace, 8)
        End Try
        Return result
    End Function
End Class




embedded-resource