Dang Dinh Nghiem Ответов: 1

Приложение GDI не может загрузить шрифт устройства из драйвера принтера на win x64


У меня есть приложение GDI, используемое для получения шрифтов устройства из драйвера принтера. В драйвере принтера функция DrvQueryFont возвращает указатель на структуру данных шрифта устройства (PIFIMETRICS). Эта функция будет вызвана механизмом рендеринга GDI, чтобы предоставить устройству шрифты, поддерживаемые текущим принтером. Проблема в том, что он корректно работает в 32-битной среде, но не работает в 64-битной среде. Пожалуйста помочь.

Что я уже пробовал:

+ При запуске приложения: функция DrvQueryFont() вызывается GDI для получения структуры IFIMETRICS для данного шрифта. мы узнали о структуре IFIMETRICS в MSDN (Microsoft Developer Network).
+ В примечаниях к структуре IFIMETRICS написано: "выравнивание элемента структуры IFIMETRICS приводит к тому, что он становится больше для машин x64, чем для машин x32, что имеет разветвления для файлов двоичного формата шрифта, отформатированных в соответствии с этой структурой. Начиная с Windows Server 2003 SP1, в Prntfont.h: PRINTIFI32 была добавлена дополнительная структура фиксированного размера. Структура PRINTIFI32 идентична структуре IFIMETRICS, за исключением того, что она не содержит элемента Align."
+ Мы предполагаем, что выравнивание элемента структуры IFIMETRICS является причиной этой проблемы.
+ Мы попытались изменить структуру IFIMETRICS на структуру PRINTIFI32, чтобы исправить этот дефект, но эта проблема все еще возникает

1 Ответов

Рейтинг:
1

KarstenK

Очевидно, что шрифт неправильно поддерживается на x64. У вас нет каких-то конкретных ошибок? Что происходит, когда вы используете другой (рабочий) шрифт?

Я надеюсь, что ваше приложение для x64 также является родным 64-битным и свободным от ошибок (таких как строки как char* или ложные размеры буфера), иначе у вас могут возникнуть проблемы с доступом к системным данным.

Посмотрите с помощью системного инструмента, чтобы дважды проверить, поддерживается ли шрифт.

Поищите какое - нибудь обновление драйвера для x64.


Dang Dinh Nghiem

У меня есть дополнительная информация следующим образом.
1. Наш собственный драйвер принтера, который разработан с использованием пакета WDK (драйвера для Windows наборы 7.1.0), известен как монолитные драйвера.
2. Кроме того, я написал пример вызова приложения EnumFontFamiliesEx() для того, чтобы подтвердить, может ли пример приложения получить информацию о шрифтах нашего собственного драйвера устройства как в 32-разрядной, так и в 64-разрядной версии Windows?
+ В 32-битной версии Windows пример приложения может успешно получить информацию о шрифтах устройства драйвера нашего собственного принтера с помощью функции EnumFontFamiliesEx() (как и ожидалось)
+ В 64-разрядной версии Windows пример приложения не может успешно получить информацию о шрифтах устройства драйвера нашего собственного принтера с помощью функции EnumFontFamiliesEx(). (против ожидаемого).
3. Наш монолитный принтер dirver использует функцию DrvQueryFont(),DrvQueryFontTree (), которая вызывается GDI для получения структуры IFIMETRICS для данного шрифта. Однако мы обнаружили разницу между 64-битной и 32-битной Windows при воспроизведении проблемы.
- В 32-битной Windows DrvQueryFont() вызывается 140 раз, а DrvQueryFontTree () - 140 раз
- В 64-битной Windows DrvQueryFont() вызывается только 1 раз, но DrvQueryFontTree() не вызывается.

Dang Dinh Nghiem

До сих пор мы не решили эту проблему. Пожалуйста, помогите мне...