Печать

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Сообщение tria » 04.05.2006 12:28:19

Разбираюсь с выводом на принтер.
Открываю проект printers\samples\selectprinter

При запуске он выдает ошибку 'External SIGSEGV' (процедура unidrv!DrvEnableDriver).
Это только у меня?

И кстати, что это за файлы с расширением inc?
tria
постоялец
 
Сообщения: 401
Зарегистрирован: 03.04.2006 11:24:10

Сообщение tria » 04.05.2006 12:30:40

Забыл дописать: 0.9.14, Вин ХР
tria
постоялец
 
Сообщения: 401
Зарегистрирован: 03.04.2006 11:24:10

Сообщение tria » 04.05.2006 12:42:04

Вылетает сугубо на строках:
AddInfo('XDPI',IntToStr(XDPI));
AddInfo('YDPI',IntToStr(YDPI));

И еще вопросик: PageHeight и PageWidth - это в чем?
tria
постоялец
 
Сообщения: 401
Зарегистрирован: 03.04.2006 11:24:10

Сообщение tria » 04.05.2006 13:47:22

Тихо сам с собою...
:)
Кажется нашел ошибку в WinUtilPrn:

Сейчас есть строка:
function CreateDC(lpszDriver, lpszDevice, lpszOutput: PChar; lpdvmInit: PDeviceMode): HDC; stdcall; external 'gdi32.dll' name 'CreateDCA';
А надо бы:
function CreateDC(lpszDriver, lpszDevice, lpszOutput: PChar; lpdvmInit: PDeviceMode): HDC; stdcall; external 'gdi32.dll' name 'CreateDC';

В Делфях:
{$EXTERNALSYM CreateDC}
function CreateDC(lpszDriver, lpszDevice, lpszOutput: PChar;
lpdvmInit: PDeviceMode): HDC; stdcall;
{$EXTERNALSYM CreateDCA}
function CreateDCA(lpszDriver, lpszDevice, lpszOutput: PAnsiChar;
lpdvmInit: PDeviceModeA): HDC; stdcall;

Так вот вопрос. Как теперь перекомпилить этот модуль?
tria
постоялец
 
Сообщения: 401
Зарегистрирован: 03.04.2006 11:24:10

Сообщение pda » 04.05.2006 14:04:43

Это надо по справкам проверять. "A" на конце API-функции означает, что это ANSI версия, а есть ещё уникодная (заканчивается на "W"). Название API без буковки - импортируется в язык. В MSVC так разделялось в зависимсоти от платформу. В Win9x - ANSI, NT+ - unicode. Но Delphi и, вероятно, FPC, всегда были ANSI...
Аватара пользователя
pda
постоялец
 
Сообщения: 303
Зарегистрирован: 27.05.2005 19:59:53

Сообщение tria » 05.05.2006 11:31:19

Я таки был не прав. Должно быть "CreateDCA"

> В Win9x - ANSI, NT+ - unicode
Не означает ли это, что в ХР должна вызываться функция CreateDCW? Или CreateDCА тоже должна поддерживаться?

Вообще-то вылет происходит здесь (winprinters.inc):
fDC:=CreateDC(nil,PChar(Printers[PrinterIndex]),nil,@PDev.DevMode);
tria
постоялец
 
Сообщения: 401
Зарегистрирован: 03.04.2006 11:24:10

Сообщение Sergei I. Gorelkin » 05.05.2006 13:04:06

Ascii-варианты функций, естественно, поддерживаются в WinNT/XP, на этот счет можно не волноваться.
Если вылет происходит внутри API функции, то нужно смотреть, что за аргументы ей передаются. Выделена ли память, заканчиваются ли строки нулем и т.д.
Принтер вообще в системе установлен? ;)
У меня один раз были грабли, когда XP была установлена поверх Win98 с сетевыми принтерами. Эти сетевые принтеры сохранились и работали в XP, но, если компьютер был отключен от сети, любая дельфевая программа валилась с похожими симптомами при первом же обращении к объекту Printer...
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
 
Сообщения: 1395
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Сообщение tria » 05.05.2006 13:44:19

Принтер сетевой, рабочий (печатаю и из опен офиса, и из Делфи).

Попробовал поменять вызов на:
var s1,s2:PChar;
s1:=StrNew(PChar('WINSPOOL'));
s2:=StrNew(PChar(Printers[PrinterIndex]));
fDC:=CreateDC(s1,s2,nil,@PDev.DevMode);

- результат тот же.

А есть люди, у кого этот пример работает? Не могли бы проверить?
tria
постоялец
 
Сообщения: 401
Зарегистрирован: 03.04.2006 11:24:10

Сообщение pda » 05.05.2006 20:20:44

tria писал(а):Не означает ли это, что в ХР должна вызываться функция CreateDCW? Или CreateDCА тоже должна поддерживаться?

Эмулируется. В NT+ Вызывается преобразование ANSI->Wide, в соответсвии с локалью приложения, затем идёт вызов W-функции. В 9x - наоборот, только далеко не все W поддерживаются.

tria писал(а):Вообще-то вылет происходит здесь (winprinters.inc):
fDC:=CreateDC(nil,PChar(Printers[PrinterIndex]),nil,@PDev.DevMode);

Вообще-то правильнее не PChar(Printers[PrinterIndex]), а PChar(строковая переменная). Что за PDev? Принтер на HP 1100?
Аватара пользователя
pda
постоялец
 
Сообщения: 303
Зарегистрирован: 27.05.2005 19:59:53

Сообщение Guest » 06.05.2006 10:34:58

На всякий случай повторюсь.
Для изучения работы печати в Лазарусе я отркыл пример из printer4lazarus. У меня этот пример не работает.
Соответственно, сбой происходит на строке:
fDC:=CreateDC(nil,PChar(Printers[PrinterIndex]),nil,@PDev.DevMode);
это строка из модуля winprinters.inc, входящего в состав printer4lazarus.

Я пробовал заменить ее на:
var s1,s2:PChar;
s1:=StrNew(PChar('WINSPOOL'));
s2:=StrNew(PChar(Printers[PrinterIndex]));
fDC:=CreateDC(s1,s2,nil,@PDev.DevMode);
эффект тот же.

@PDev.DevMode - это указатель на структуру типа PDeviceMode, служащую для получения свойств устройства (см. WinUtilPrn).

Экспорт функции CreateDC описан в WinUtilPrn следующим образом:
function CreateDC(lpszDriver, lpszDevice, lpszOutput: PChar; lpdvmInit: PDeviceMode): HDC; stdcall; external 'gdi32.dll' name 'CreateDCA';

Теперь прямо не знаю, что делать...
Guest
 

Сообщение tria » 06.05.2006 12:02:01

Последний пост мой - забыл войти :)
tria
постоялец
 
Сообщения: 401
Зарегистрирован: 03.04.2006 11:24:10


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: Yandex [Bot] и гости: 11

Рейтинг@Mail.ru