Вчера пришла в голову одна идея, и я решил написать одну утилиту. Загрузить файл .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
#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)
Комментарии
Отправить комментарий