Blog. Just Blog

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

Версия для печати Добавить в Избранное Отправить на E-Mail | Категория: Образ мышления: Assembler | Автор: ManHunter
Получение информации о шрифте с помощью функции GetFontResourceInfo
Получение информации о шрифте с помощью функции GetFontResourceInfo

В статье о загрузке шрифтов из памяти я упомянул об использовании недокументированной функции GetFontResourceInfo, но не привел никаких примеров ее вызова. А функция интересная, так что самое время исправить этот пробел в знаниях.

Начнем с описания самой функции, так как ни MSDN, ни какой-либо иной официальный источник вам в этом не поможет. Она экспортируется из библиотеки gdi32.dll по имени GetFontResourceInfoW. Если ваше приложение используется на старых системах, то было бы очень неплохо предварительно проверять ее наличие в указанной библиотеке, мало ли что. Первый параметр - юникодная строка с именем файла шрифта, пусть не обязательно должен быть полным. Второй параметр - указатель на переменную, в которой содержится размер буфера для приема данных. Третий параметр - указатель на сам буфер. Последний параметр - тип запрашиваемых данных. Исследователи раскопали пока что следующие возможные значения типов:
  1. QFR_0           = 0 ; Unknown
  2. QFR_DESCRIPTION = 1 ; Имя шрифта, которое используется системой
  3. QFR_LOGFONT     = 2 ; Массив структур LOGFONT
  4. QFR_PDEV        = 3 ; Unknown
  5. QFR_FONTFILE    = 4 ; Имя файла шрифта
  6. QFR_5           = 5 ; Unknown
Теперь важное замечание. Функция GetFontResourceInfo работает только со шрифтами, которые уже установлены в системе. То есть нельзя взять и просто получить информацию из произвольного файла со шрифтом.

Для правильного использования функции шрифт должен быть установлен в систему, пусть даже временно. После получения нужной информации шрифт можно удалить из системы. Но тут надо понимать, что шрифт может быть ранее установлен в систему другим приложением, и просто так брать и удалять его нельзя. Поэтому функция вызывается два раза. Если первый раз получить информацию о шрифте не получилось, то шрифт временно устанавливается в систему при помощи функции AddFontResourceEx и обязательно с флагом FR_NOT_ENUM, а после получения данных удаляется из системной таблицы шрифтов при помощи функции RemoveFontResourceEx с тем же флагом. Если удалось получить информацию с первого раза, то значит шрифт уже установлен в систему и трогать его не следует. При этом подразумевается, что файл шрифта физически присутствует, эти проверки должны выполняться до вызова GetFontResourceInfo.
  1.         ; Если шрифт уже был установлен в систему,
  2.         ; то получим информацию с первого раза
  3.         mov     [cbBuffer],MAX_PATH
  4.         invoke  GetFontResourceInfo,ttf_file,cbBuffer,buff,QFR_DESCRIPTION
  5.         or      eax,eax
  6.         jnz     @f
  7. loc_install:
  8.         ; Временно установить шрифт в систему
  9.         invoke  AddFontResourceEx,ttf_file,FR_NOT_ENUM,0
  10.         mov     [cbBuffer],MAX_PATH
  11.         invoke  GetFontResourceInfo,ttf_file,cbBuffer,buff,QFR_DESCRIPTION
  12.         ; Удалить установленный шрифт
  13.         invoke  RemoveFontResourceEx,ttf_file,FR_NOT_ENUM,0
  14. @@:
  15.         ; buff -> строка с названием шрифта
Если в файле содержится несколько шрифтов, то функция вернет строку с их названиями, разделенными символами " & ". Для получения подробной информации о шрифте, надо запросить информацию с флагом QFR_LOGFONT, в этом случае в буфер будет записан массив структур LOGFONT соответствующий количеству содержащихся в файле шрифтов.

Функция GetFontResourceInfo прекрасно работает с файлами шрифтов ttf, otf, fon, ttc, pfm и в большинстве случаев получает более корректную информацию, чем та, которую удается извлечь при ручном парсинге.

В приложении пример программы с исходным текстом, которая получает информацию о названии шрифта из файла.

Пример программы с исходным текстом (FASM)Пример программы с исходным текстом (FASM)

Get.Font.Name.Demo.zip (39,349 bytes)


Поделиться ссылкой ВКонтакте
Просмотров: 645 | Комментариев: 3

Метки: Assembler
Внимание! Статья опубликована больше года назад, информация могла устареть!

Комментарии

Отзывы посетителей сайта о статье
Zeroes (08.01.2024 в 22:44):
О да! 22 года назад написал (потому что консольных менеджеров так и не нашёл) консольную утилитку на Pascal'e (пусть земля будет пухом Николасу Вирту!) 50kb

просмотр имени шрифта
установка шрифта

всё хочу перекомпилить на современное что то в (идеале конечно ASM :)
на современный лад, а то я там функции без Ex использую :/ да и про флаги не знал.
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 - говорит о том что шрифт выставлен на удаление, но файл всё ещё используется и его удаление нужно отложить до следующей перезагрузки.

Добавить комментарий

Заполните форму для добавления комментария
Имя*:
Текст комментария (не более 2000 символов)*:

*Все поля обязательны для заполнения.
Комментарии, содержащие рекламу, ненормативную лексику, оскорбления и т.п., а также флуд и сообщения не по теме, будут удаляться. Нарушителям может быть заблокирован доступ к сайту.
Наверх
Powered by PCL's Speckled Band Engine 0.2 RC3
© ManHunter / PCL, 2008-2025
При использовании материалов ссылка на сайт обязательна
Время генерации: 0.07 сек. / MySQL: 2 (0.0045 сек.) / Память: 4.5 Mb
Наверх