powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Помогите разобраться с DEVMODE
5 сообщений из 5, страница 1 из 1
Помогите разобраться с DEVMODE
    #33017678
Bless
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В Windows 98 я вызвал функцию EnumPrinters:
EnumPrinters(PRINTER_ENUM_LOCAL, NULL, 2, prnInfo, cByte, &cByte, &cStruct)

То есть в prninfo должен вернуться массив структур PRINTER_INFO_2 для всех принтеров
(у меня вернуло 3 принтера, все сетевые и на машинах, к которым они подключены, стоит тоже Windows 98)
У структуры PRINTER_INFO_2 есть поле PDEVMODE pDevMode.
Меня озадачили поля pDevMode->dmPenningWidth, pDevMode->dmPenningHeight.
В документации по их поводу написано

Windows NT/2000/XP: This member must be zero.
Windows 95/98/Me: THIS MEMBER IS NOT SUPPORTED.

Я так понял, что под Win98 их можно вообще игнорировать.
Но у меня значение этого поля для всех трех структур после вызова EnumPrinters совершенно разное.
Более того у структуры, которая соответствует моему принтеру по умолчанию (HP LaserJet 1200 Series PCL 6)
поле pDevMode->dmFields =0x803F03, то есть установлен бит DM_PANNINGWIDTH

Посему вопрос: какую смысловую нагрузку несут поля dmPenningWidth и dmPenningHeight
и на что влияет поле dmFields.
...
Рейтинг: 0 / 0
Помогите разобраться с DEVMODE
    #33019046
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlessНо у меня значение этого поля для всех трех структур после вызова EnumPrinters совершенно разное.
Их НУЖНО игнорировать.
Сходи в инклуд и посмотри как эта структура (DEVMODE) объявлена. Там увидишь, в самом конце:
Код: plaintext
1.
2.
3.
#if (WINVER >= 0x0500) || (_WIN32_WINNT >= 0x0400)
  DWORD  dmPanningWidth;
  DWORD  dmPanningHeight;
#endif
Причем это самые последние поля структуры. То есть в твоем случае, те "разные" значения что ты видишь на самом деле принадлежат не этой структуре, а следующей за ними каким-то другим переменным. То есть теоретически, обращаясь на 9x к этим полям ты рискуешь получить GPF по причине запроса в чужую память.

BlessПосему вопрос: какую смысловую нагрузку несут поля dmPenningWidth и dmPenningHeight и на что влияет поле dmFields.
dmFields говорорит пользовательской программе какие поля общей универсальной структуры были проинициализированы вот этим конкретным драйвером. Драйвер же чаще всего и выделяет память под структуру. То есть если драйвер принтера расчитан на работу в NT+ то он вполне может проинициализировать эти два поля вполне правдивыми значениями. Если же драйвер принтера расчитан на 9x то ...

А вот для чего эти поля предназначены я не очень представляю. "must be zero" значит оно нам не нужно :)
...
Рейтинг: 0 / 0
Помогите разобраться с DEVMODE
    #33024448
Bless
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White Owl
dmFields говорорит пользовательской программе какие поля общей универсальной структуры были проинициализированы вот этим конкретным драйвером.


Но о чем это говорит? О том, что все остальные поля этому конкретному драйверу не нужны? Или о том, что их инициализация оставляется на откуп программисту?

White Owl
То есть теоретически, обращаясь на 9x к этим полям ты рискуешь получить GPF по причине запроса в чужую память.


Почему тогда драйвер принтера HP LaserJet 1200 Series PCL 6 под Windows 98 установил бит DM_PANNINGWIDTH структуры dmFields
White Owl
Код: plaintext
1.
2.
3.
4.
#if (WINVER >= 0x0500) || (_WIN32_WINNT >= 0x0400)
  DWORD  dmPanningWidth;
  DWORD  dmPanningHeight;
#endif
Причем это самые последние поля структуры. То есть в твоем случае, те "разные" значения что ты видишь на самом деле принадлежат не этой структуре,


Эээ. А какой винде соответствует (WINVER == 0x0500)?


Вообще-то этот вопрос возник вот почему:

После того как я получил список из трех структур PRINTER_INFO_2, я подменил у структуры, соответствующей принтеру Kyocera FS-1000, поле pDevMode на поле pDevMode структуры, соответствующей принтеру HP LaserJet 1200 Series PCL 6.
Последующий вызов функции
DeviceCapabilities(Info.pPrinterName, Info.pPortName, DC_PAPERS, paper_types, Info.pDevMode), (где Info - это PRINTER_INFO_2 Kyocera-ы с подмененной Info.pDevMode) привел к большому белому окну со словами "Ошибка в программе. Для продолжения нажмите кнопу "Пропустить" и сохраните даные в новом файле. Для выхода из программы нажмите кнопку "закрыть", при этом все изменения будут потеряны". А после этого "Ваша программа выполнила недопустимую операцию... обратитесь к разработчику".

Причем, если проделать все то же самое, только оставив старым, родным для Kyocera-ы, поле Info.pDevMode->dmPanningHeight, то ошибки нет! Причем установка/снятие бита DM_PANNINGHEIGHT в dmFields никак на эту ошибку не влияет. Вот я и ломаю голову, как это поле, которое в Win 98 вроде как игнорируется, так круто влияет на поведение программы.

Причем такая ошибка наблюдается только в случае, если HP LaserJet 1200 Series PCL 6 - принтер по умолчанию. Если поставить таковым любой другой принтер из трех, доступных мне, то вышеописанные манипуляции к ошибке не приводят.

PS Такие эксперименты мне в голову пришли не от скуки. Просто такое белое окошко стало выскакивать в моей программе на Делфи, когда в предварительном просмотре (компонент отчетов FastReport) меняешь принтер с HP LaserJet 1200 Series PCL 6 на Kyocera FS-1000. Глянул исходники FastReport-а, и нашел это самое место, вот теперь ломаю голову. :(
...
Рейтинг: 0 / 0
Помогите разобраться с DEVMODE
    #33026418
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Bless White Owl
dmFields говорит пользовательской программе какие поля общей универсальной структуры были проинициализированы вот этим конкретным драйвером.

Но о чем это говорит? О том, что все остальные поля этому конкретному драйверу не нужны? Или о том, что их инициализация оставляется на откуп программисту?
Не проиницилизированные драйвером поля обычно не играют для драйвера никакой роли. Либо ошибка в драйвере :)

BlessПочему тогда драйвер принтера HP LaserJet 1200 Series PCL 6 под Windows 98 установил бит DM_PANNINGWIDTH структуры dmFields
Скорее всего, потому что этот драйвер писался изначально с учетом NT а потом уже подгонялся под 98.


BlessВот я и ломаю голову, как это поле, которое в Win 98 вроде как игнорируется, так круто влияет на поведение программы.
Ну как я и предупреждал - в одном случае под эти поля память выделяется, в других нет. Ну а тот кто про поля не знает, тот не знает и что делать с соотвествующим битом в dwFlags и игнорирует его.

BlessПричем такая ошибка наблюдается только в случае, если HP LaserJet 1200 Series PCL 6 - принтер по умолчанию. Если поставить таковым любой другой принтер из трех, доступных мне, то вышеописанные манипуляции к ошибке не приводят.
Скорее всего бага именно в драйвере этого HP LJ. Если он принтер по умолчанию, то он может использовать короткий вариант структуры, а если принтер не установлен основным - то длинный. Тебе ж никто не гарантирует что в обоих случаях (по умолчанию или нет) драйвер будет использовать один и тот же код для описания принтера :)

BlessPS Такие эксперименты мне в голову пришли не от скуки. Просто такое белое окошко стало выскакивать в моей программе на Делфи, когда в предварительном просмотре (компонент отчетов FastReport) меняешь принтер с HP LaserJet 1200 Series PCL 6 на Kyocera FS-1000. Глянул исходники FastReport-а, и нашел это самое место, вот теперь ломаю голову. :(
Они меняют данные в этих полях? Ну тогда проще всего написать им. FastReport'овцы даже на этом форуме появляются иногда :)
...
Рейтинг: 0 / 0
Помогите разобраться с DEVMODE
    #33029912
Bless
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White Owl
Они меняют данные в этих полях? Ну тогда проще всего написать им. FastReport'овцы даже на этом форуме появляются иногда :)

Да нет, они как раз не меняют, в том-то все и дело.
После выбора принтера(событие OnClick для ListBox-а со списком принтеров в форме-диалоге выбора принтера)
меняются device name и driver name на новые значения, а вот DevMode остается от старого принтера.

Все становится ОК, если раскомментировать закомментированную по умолчанию строчку
//{$DEFINE PRN_RESET} в модуле FR_Prntr.pas
о которой я только 3 часа назад вспомнил :)

В общем, проблемы больше нет. Но можно сказать, что она возникала не зря. :)Спасибо.
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Помогите разобраться с DEVMODE
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]