
Получение информации о шрифте с помощью функции GetFontResourceInfo

Получение информации о шрифте с помощью функции GetFontResourceInfo
В статье о загрузке шрифтов из памяти я упомянул об использовании недокументированной функции GetFontResourceInfo, но не привел никаких примеров ее вызова. А функция интересная, так что самое время исправить этот пробел в знаниях.
Начнем с описания самой функции, так как ни MSDN, ни какой-либо иной официальный источник вам в этом не поможет. Она экспортируется из библиотеки gdi32.dll по имени GetFontResourceInfoW. Если ваше приложение используется на старых системах, то было бы очень неплохо предварительно проверять ее наличие в указанной библиотеке, мало ли что. Первый параметр - юникодная строка с именем файла шрифта, пусть не обязательно должен быть полным. Второй параметр - указатель на переменную, в которой содержится размер буфера для приема данных. Третий параметр - указатель на сам буфер. Последний параметр - тип запрашиваемых данных. Исследователи раскопали пока что следующие возможные значения типов:
Code (Assembler) : Убрать нумерацию
- QFR_0 = 0 ; Unknown
- QFR_DESCRIPTION = 1 ; Имя шрифта, которое используется системой
- QFR_LOGFONT = 2 ; Массив структур LOGFONT
- QFR_PDEV = 3 ; Unknown
- QFR_FONTFILE = 4 ; Имя файла шрифта
- QFR_5 = 5 ; Unknown
Для правильного использования функции шрифт должен быть установлен в систему, пусть даже временно. После получения нужной информации шрифт можно удалить из системы. Но тут надо понимать, что шрифт может быть ранее установлен в систему другим приложением, и просто так брать и удалять его нельзя. Поэтому функция вызывается два раза. Если первый раз получить информацию о шрифте не получилось, то шрифт временно устанавливается в систему при помощи функции AddFontResourceEx и обязательно с флагом FR_NOT_ENUM, а после получения данных удаляется из системной таблицы шрифтов при помощи функции RemoveFontResourceEx с тем же флагом. Если удалось получить информацию с первого раза, то значит шрифт уже установлен в систему и трогать его не следует. При этом подразумевается, что файл шрифта физически присутствует, эти проверки должны выполняться до вызова GetFontResourceInfo.
Code (Assembler) : Убрать нумерацию
- ; Если шрифт уже был установлен в систему,
- ; то получим информацию с первого раза
- mov [cbBuffer],MAX_PATH
- invoke GetFontResourceInfo,ttf_file,cbBuffer,buff,QFR_DESCRIPTION
- or eax,eax
- jnz @f
- loc_install:
- ; Временно установить шрифт в систему
- invoke AddFontResourceEx,ttf_file,FR_NOT_ENUM,0
- mov [cbBuffer],MAX_PATH
- invoke GetFontResourceInfo,ttf_file,cbBuffer,buff,QFR_DESCRIPTION
- ; Удалить установленный шрифт
- invoke RemoveFontResourceEx,ttf_file,FR_NOT_ENUM,0
- @@:
- ; buff -> строка с названием шрифта
Функция GetFontResourceInfo прекрасно работает с файлами шрифтов ttf, otf, fon, ttc, pfm и в большинстве случаев получает более корректную информацию, чем та, которую удается извлечь при ручном парсинге.
В приложении пример программы с исходным текстом, которая получает информацию о названии шрифта из файла.
Просмотров: 645 | Комментариев: 3
Метки: Assembler

Внимание! Статья опубликована больше года назад, информация могла устареть!
Комментарии
Отзывы посетителей сайта о статье

ManHunter
(29.12.2023 в 19:23):
DRON, как обычно, респект и уважуха.

DRON
(29.12.2023 в 18:18):
>>>Исследователи раскопали пока что следующие возможные значения типов:
Подробное описание параметров и исходники функции можно найти вот тут:
https://github.com/ZoloZiak/Wi...e/cpanel.cxx
QFR_0 - это просто количество шрифтов в файле
QFR_PDEV - влияет на имя/иконку шрифта в панели управления
QFR_5 - говорит о том что шрифт выставлен на удаление, но файл всё ещё используется и его удаление нужно отложить до следующей перезагрузки.
Подробное описание параметров и исходники функции можно найти вот тут:
https://github.com/ZoloZiak/Wi...e/cpanel.cxx
QFR_0 - это просто количество шрифтов в файле
QFR_PDEV - влияет на имя/иконку шрифта в панели управления
QFR_5 - говорит о том что шрифт выставлен на удаление, но файл всё ещё используется и его удаление нужно отложить до следующей перезагрузки.

Добавить комментарий
Заполните форму для добавления комментария

просмотр имени шрифта
установка шрифта
всё хочу перекомпилить на современное что то в (идеале конечно ASM :)
на современный лад, а то я там функции без Ex использую :/ да и про флаги не знал.