Ошибка возникает из-за того, что 1с сама формирует запрошенное число копий, а потом wine добовляет в вывод ps тег NumOfCopies. Тестировал как бесплатные, так и коммерческие сборки WINE@Etersof на Debian, Ubuntu, и CentOS 5.1 - везде присудствует эта ошибка. Для себя я проблему решил - прописал в исходниках wineps принудительно значение NumOfCopies = 1, но подобный костыль ломает печать из остальных приложений.
*** Bug 1423 has been marked as a duplicate of this bug. ***
Трудно воспроизвести багу. Пробую печатать в файл. В итоге только 1 раз, когда я выбирал 3 копии, программа показала: "печатаю 1/9...." В остальных случаях пишет "печатаю 1/1...." независимо от числа копий. А в выходном файле всё нормально: столько страниц, сколько должно быть
При дебаге обнаружил, что в одних случаях функция выдаёт: trace:psdrv:PSDRV_MergeDevmodes Changing Copies to 3 а в других: trace:psdrv:PSDRV_MergeDevmodes Changing Copies to 1 при этом выходной файл содержит столько страниц, сколько надо (возможно внутри содержится информация о числе копий, но как мне её не удалось прочитать стандартными средствами) Changing Copies to... когда 3, а когда 1. Зависимость прослеживается плохо, но заметил, что при смене принтера это число 1.
ага! Если открыть файл в текстовом редакторе, то можно найти строку: mark { << /NumCopies 4 >> setpagedevice } stopped cleartomark т.е сам файл состоит из 4-х копий документа, да ещё и печатается 4 раза
Проверил: сразу после смены принтера печатается столько страниц, сколько нужно
стек вызова непосредственно перед изменением числа копий: PSDRV_CreateDC -> PSDRV_MergeDevmodes а в PSDRV_MergeDevmodes стоит комманда: dm1->dmPublic.u1.s1.dmCopies = dm2->dmPublic.u1.s1.dmCopies; TRACE("Changing Copies to %d\n", dm2->dmPublic.u1.s1.dmCopies); как я понял PSDRV_CreateDC вызывается непосредственно из программы (т.к вызова этой функции из других я не нашёл)
Нашёл примерное место ошибки: в comdlg32/printdlg.c функция PRINTDLG_UpdatePrintDlgA если не выполняется (а оно в данном случае не выполняется) if (lppd->Flags & PD_USEDEVMODECOPIESANDCOLLATE) то приложение само ответственно за печать нескольких копий. Выполняется: if (IsDlgButtonChecked(hDlg, chx2) == BST_CHECKED) lppd->Flags |= PD_COLLATE; else lppd->Flags &= ~PD_COLLATE; lppd->nCopies = GetDlgItemInt(hDlg, edt3, NULL, FALSE);
Ошибся в предыдущем сообщении Если в lppd->Flags стоит бит PD_USEDEVMODECOPIESANDCOLLATE т.е выполняется условие if (lppd->Flags & PD_USEDEVMODECOPIESANDCOLLATE) это значит, что принтер не поддерживает печать нескольких копий, и приложение само ответственно за это. В данном случае всё правильно: принтер поддерживает печать копий. Скорее всего неправильно формируется сам документ
Есть заявка по проблеме http://rt.etersoft.ru/Ticket/Display.html?id=5730
Разобрался со флагом PD_USEDEVMODECOPIESANDCOLLATE Если он сброшен, то приложение ответственно за печать нескольких копий (в нашем случае он сброшен) Есть 2 переменные, в которых задаётся число копий: - dmCopies в структуре DEVMODE - отвечает за драйвер принтера - nCopies в структуре PRINTDLG - если я правильно понял, это количество копий, которе должно создать приложение Получается, что если nCopies = Х, то приложение создаёт Х копий, а если ещё dmCopies = X, то драйвер эти Х копий повторяет Х раз. Получается Х^2. Думаю надо просто проверять флаг PD_USEDEVMODECOPIESANDCOLLATE и, если он сброшен, то ставить dmCopies = 1
Исправлено! Патч лежит в /wine-etersoft-public/patches/check/comdlg32-printdlg-number_of_copies.patch
Будет ли патч выложен в ближайшее время для общего доступа или его можно будет забирать только вместе с новой версией 1.0.9?
Будет обновлённая сборка бета-версии.
*** Bug 2530 has been marked as a duplicate of this bug. ***