Сейчас для печати используются 16-битные функции из gdi32, которые не всегда корректно работают. К тому же появилась бага 1185, в которой так и не удалось отказаться от fork(). Думаю следует пререписать систему печати с использованием функций cups
Сейчас в wine уже есть кусок кода (функция ScheduleJob), который может использовать функции cups. На сайте CUPS: http://www.cups.org/documentation.php/api-cups.html очень хорошо документированы функции печати. Думаю вполне реально перейти на их использование.
в wine есть вспомогательная функция schedule_cups, которая печатает через cupsPrintFile. Проблема в том, что cupsPrintFile требует во входных параметрах указывать имя файла. Т.е перед её вызовом должен быть уже сформированный файл. Есть ещё один способ печати через CUPS: 1) создаётся задание cupsCreateJob 2) в начале каждого документа задание вызывается cupsStartDocument 3) сам документ записывается с помощью cupsWriteRequestData (здесь я плохо разобрался) 4) документ завершается cupsFinishDocument. Если я всё правильно понял, то это то, что надо. Но есть несколько замечаний: 1) кроме jobId, при вызове Start и Finish нужно ещё передавать dest->name. 2) Пока не понятно что такое Destination name (dest->name), но это точно не название документа 3) при вызове cupsWriteRequestData не указывается ни dest->name, ни jobID. Отсюда следует, что 2 документа одновременно посылать на печать нельзя.
Разобрался с DestinationName. Это имя принтера, на который производится печать. Рекомендуется получать его с помощью функций cups: cups_dest_t *dests; int num_dests = cupsGetDests(&dests); cups_dest_t *dest = cupsGetDest("name", NULL, num_dests, dests); /* do something wiith dest */ cupsFreeDests(num_dests, dests); Но теперь возникла проблема с options. В документации сказано "options members contain the default options for a particular destination, along with several informational attributes about the destination as shown in Table 1". Все опции в таблице1 предназначены для получении информации о принтере. Про остальные опции ничего не сказано. Ещё в документации сказано, что можно добавлять свои опции, но не понятно зачем. А вообще, я предполагал, что через опции можно задавать количество копий и разбивку по копиям, но как это сделать, и возможно ли это вообще - пока не ясно.
Как я догадываюсь, количество копий и разбивка по копиям передаются через аттрибуты NumCopies и Collate. Для проверки необходимо написать тестовую программу.
Начал писать тест. Столкнулся с проблемой: в cups/cups.h отсутствуют некоторые константы типа CUPS_HTTP_DEFAULT, а также прототипы функций cupsCreateJob и др.
Оказалось, что данные команды и константы появились только в новой версии CUPS. Если я правильно понимаю, то бага 1185 решена. Тогда отпадает надобность что-либо переделывать