API CreateScalableFontResource => Fehler PInvokeStackimbalance

  • VB.NET

Es gibt 2 Antworten in diesem Thema. Der letzte Beitrag () ist von drschef.

    API CreateScalableFontResource => Fehler PInvokeStackimbalance

    Beim Aufruf der Funktion CreateScalableFontResource

    Private Declare Function CreateScalableFontResource Lib "gdi32" Alias "CreateScalableFontResourceA" _
    (ByVal fHidden As Long, _
    ByVal lpszResourceFile As String, _
    ByVal lpszFontFile As String, _
    ByVal lpszCurrentPath As String) As Long

    wird ein Fehler PInvokeStackImbalance gemeldet. Der Aufruf erfolgt in der Form

    If CreateScalableFontResource(1, TempName, fname, vbNullString) Then
    ...
    End If

    Den Aufruf habe ich bereits mehrfach erfolglos modifiziert. Andererseits erfährt man im Font-Verzeichnis nur die Dateinamen und in der Fonts-Auflistung nur die Fontnamen, so dass ich eine Umschlüsselung brauche.

    Nach einem Umstieg auf Windows 10 sind bei mir ein paar Hundert Fonts zwar im Font-Verzeichnis als Dateien enthalten, werden aber in den Font-Auswahlen nicht mehr angeboten. Darauf versuche ich ein Programm mit näherungsweise folgender Funktion zu realisieren:

    - die ttf-Dateien im Font Verzeichnis werden der Reihe nach aufgerufen
    - dazu die zugehörigen Font-Bezeichnungen ermittelt
    - Prüfen ob diese in der Font-Auflistung gefunden werden
    - und falls nicht, sollen diese Font-Dateien gelöscht werden, da sie ohnehin nicht angeboten werden.

    Nun stehe ich vor dem wahrscheinlich formalen Fehler, dessen Ursache ich bisher nicht ermitteln konnte.

    *Topic verschoben*

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Marcus Gräfe“ ()

    @drschef Das ist VB6-Ranz.
    Machst Du aus den Long je ein Integer.
    pinvoke.net/default.aspx/gdi32…ScalableFontResource.html
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    Die Lösung

    Hallo,

    Danke Rod, Dein Beitrag hat mich wie schon oft auf den richtigen Weg gebracht. Der wichtige Hinweis war das "A" am Ende der Funktion.
    Jetzt lautet die Funktion für das Auslesen der Bezeichnungen der Fonts so:

    VB.NET-Quellcode

    1. Public Function GetFontName(ByVal fname As String, Optional ByVal err As String = "") As String
    2. Dim Buffer As String = ""
    3. Dim FontName As String = ""
    4. Dim TempName As String = ""
    5. Dim zeile As String = ""
    6. Dim Pos As Integer = 0
    7. Dim PosE As Integer = 0
    8. Try
    9. TempName = Environment.GetEnvironmentVariable("Temp") & "\~TEMP.FOT"
    10. If File.Exists(TempName) Then File.Delete(TempName) 'Bereinigen.
    11. If CBool(CreateScalableFontResourceA(1, TempName, fname, vbNullString)) Then
    12. Using sr As New StreamReader(TempName)
    13. Buffer = sr.ReadToEnd 'Datei in Buffer einlesen
    14. End Using
    15. Pos = Buffer.IndexOf("FONTRES:") + 8
    16. PosE = Buffer.IndexOf(Char.MinValue, Pos)
    17. FontName = Buffer.Substring(Pos, PosE - Pos).Trim
    18. Return FontName
    19. Else
    20. err = "Der Fontname konnte nicht ermittelt werden"
    21. Return String.Empty
    22. End If
    23. Catch ex As Exception
    24. err = ex.Message
    25. Return String.Empty
    26. End Try
    27. End Function