Получение имени шрифта из файла TTF

 

Вчера пришла в голову одна идея, и я решил написать одну утилиту. Загрузить файл .TTF легко, использовать для рисования тоже. Но есть одна загвоздка - нужно знать имя  шрифта в этом файле.

Нашлось одно решение - недокументированная команда библиотеки GDI32.dll, и вышло так:

;https://www.manhunter.ru/assembler/1953_poluchenie_informacii_o_shrifte_s_pomoschyu_funkcii_getfontresourceinfo.html
#QFR_DESCRIPTION=1
If OpenLibrary(0,"gdi32.dll")
  *f=GetFunction(0,"GetFontResourceInfoW")
  If *f
    f$="Acidic.ttf"
    sz=0
    rr=CallFunctionFast(*f,@f$,@sz,0,#QFR_DESCRIPTION)
    If rr
      *b=AllocateMemory(sz)
      rr=CallFunctionFast(*f,@f$,@sz,*b,#QFR_DESCRIPTION)
      Debug PeekS(*b,-1,#PB_Unicode)
      FreeMemory(*b)
    Else
      Debug "oops!"
    EndIf
    CloseLibrary(0)
  Else
    Debug "no function found"
  EndIf
Else
  Debug "no DLL found"
EndIf

Трудно  пробраться сквозь условия проверок, но в них и запрятаны проверки на ошибки.

Дополнение Этот код работает, хз пойми почему.
;https://web.archive.org/web/20151026061830/http://www.undocprint.org/winspool/getfontresourceinfo
#QFR_DESCRIPTION=1

#FR_NOT_ENUM=$20

    f$="Acidic.ttf"

  OpenLibrary(0,"gdi32.dll")
  rr=CallFunction(0,"AddFontResourceExW",@f$,#FR_NOT_ENUM,0)
    sz=0
    rr=CallFunction(0,"GetFontResourceInfoW",@f$,@sz,0,1)
    If rr
      *b=AllocateMemory(sz)
      rr=CallFunction(0,"GetFontResourceInfoW",@f$,@sz,*b,1)
      Debug PeekS(*b,-1,#PB_Unicode)
      FreeMemory(*b)
    Else
      Debug "oops!"
    EndIf
  rr=CallFunction(0,"RemoveFontResourceExW",@f$,#FR_NOT_ENUM,0)
  CloseLibrary(0)

Комментарии