Печать
Модератор: Модераторы
Тихо сам с собою...

Кажется нашел ошибку в 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;
Так вот вопрос. Как теперь перекомпилить этот модуль?
Кажется нашел ошибку в 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;
Так вот вопрос. Как теперь перекомпилить этот модуль?
Это надо по справкам проверять. "A" на конце API-функции означает, что это ANSI версия, а есть ещё уникодная (заканчивается на "W"). Название API без буковки - импортируется в язык. В MSVC так разделялось в зависимсоти от платформу. В Win9x - ANSI, NT+ - unicode. Но Delphi и, вероятно, FPC, всегда были ANSI...
- Sergei I. Gorelkin
- энтузиаст
- Сообщения: 1409
- Зарегистрирован: 24.07.2005 14:40:41
- Откуда: Зеленоград
Ascii-варианты функций, естественно, поддерживаются в WinNT/XP, на этот счет можно не волноваться.
Если вылет происходит внутри API функции, то нужно смотреть, что за аргументы ей передаются. Выделена ли память, заканчиваются ли строки нулем и т.д.
Принтер вообще в системе установлен?
У меня один раз были грабли, когда XP была установлена поверх Win98 с сетевыми принтерами. Эти сетевые принтеры сохранились и работали в XP, но, если компьютер был отключен от сети, любая дельфевая программа валилась с похожими симптомами при первом же обращении к объекту Printer...
Если вылет происходит внутри API функции, то нужно смотреть, что за аргументы ей передаются. Выделена ли память, заканчиваются ли строки нулем и т.д.
Принтер вообще в системе установлен?
У меня один раз были грабли, когда XP была установлена поверх Win98 с сетевыми принтерами. Эти сетевые принтеры сохранились и работали в XP, но, если компьютер был отключен от сети, любая дельфевая программа валилась с похожими симптомами при первом же обращении к объекту Printer...
Принтер сетевой, рабочий (печатаю и из опен офиса, и из Делфи).
Попробовал поменять вызов на:
var s1,s2:PChar;
s1:=StrNew(PChar('WINSPOOL'));
s2:=StrNew(PChar(Printers[PrinterIndex]));
fDC:=CreateDC(s1,s2,nil,@PDev.DevMode);
- результат тот же.
А есть люди, у кого этот пример работает? Не могли бы проверить?
Попробовал поменять вызов на:
var s1,s2:PChar;
s1:=StrNew(PChar('WINSPOOL'));
s2:=StrNew(PChar(Printers[PrinterIndex]));
fDC:=CreateDC(s1,s2,nil,@PDev.DevMode);
- результат тот же.
А есть люди, у кого этот пример работает? Не могли бы проверить?
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?
-
Guest
На всякий случай повторюсь.
Для изучения работы печати в Лазарусе я отркыл пример из 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';
Теперь прямо не знаю, что делать...
Для изучения работы печати в Лазарусе я отркыл пример из 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';
Теперь прямо не знаю, что делать...
