Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Последние темы форума

Показать новые сообщения »

Почтовая рассылка

Подписчиков: 11678
Последний выпуск: 19.06.2015

Печать в XPS работает, на принтер — нет

6
12 февраля 2015 года
@pixo $oft
3.4K / / 20.09.2006
Всем привет! Очень нужна ваша помощь.
Есть код, который выводит документ на печать. Всё замечательно работает для виртуального XPS-принтера, но при попытке вывести на реальный возникает ошибка, причём не в коде программы (я проверял коды возврата), а в самой очереди печати. У меня даже идей нет, в чём может быть дело. Ведь по сути, подсистема печати абстрагирует код от устройства, поэтому неважно, виртуальное оно или реальное — если код выводит в виртуальный принтер, то и в реальный должен выводить. Но на практике это почему-то не так. Что я делаю не так?
Прикрепленные файлы:
15 Кб
Загрузок: 232
285
14 февраля 2015 года
sadovoya
757 / / 19.11.2005
Что-то пытается использовать указатель lpszDocName, ожидая строку. Поэтому туда хотя-бы пустую строку надо. Крах из=за этого.
На всякий случай еще поле размера можно заполнить lpDI->cbSize=sizeof(*lpDI);
Остальные поля видимо можно оставить
285
12 февраля 2015 года
sadovoya
757 / / 19.11.2005
Может дело в принтере? Если хотите, выложите экзешник - завтра вечером проверю на своем принтере. У меня импорт в Code::Blocks не удался, скомпилировать не смог.
319
12 февраля 2015 года
UserNet2008
691 / / 03.04.2010
В 7 or 8 по умолчанию setup XPS-принтер. От этого нужно исходить. Откройте для примера "Блокнот" потом File>Print , в окне Print , должен быть ваш физический принтер. Пробуем делать Печать из "Блокнот". Если нет , тут есть одна деталь, но не факт Windows подставил не правильные дрова. Ставим родные дрова.
Ну раз мы находимся в теме WIN32 API. То нужно смотреть в сторону GetPrinter, SetPrinter, GetPrinterData, SetPrinterData, OpenPrinter и т.д.
Короче потом нужно физический принтер сделать по умолчанию.
P/S
Типа так в трёх словах.
6
13 февраля 2015 года
@pixo $oft
3.4K / / 20.09.2006
Очень странно, что "memory allocation error" возникает при компиляции ☺ Переименуй файл из вложения в .exe

Принтер по умолчанию влиять не должен. Или что, если по умолчанию выбран XPS, то при попытке печати на другой я ошибку должен получить? Бред. Тем более, пробовалось и на системе, где установлен по умолчанию обычный принтер. То же самое.
Прикрепленные файлы:
16 Кб
Загрузок: 185
319
13 февраля 2015 года
UserNet2008
691 / / 03.04.2010
 
Код:
BOOL OpenPrinter(
  _In_   LPTSTR pPrinterName,
  _Out_  LPHANDLE phPrinter,
  _In_   LPPRINTER_DEFAULTS pDefault
);
6
13 февраля 2015 года
@pixo $oft
3.4K / / 20.09.2006
И что мне это дало? Объявление функции я смогу прекрасно посмотреть на MSDN, а для открытия принтера эта функция необязательна — принтер у меня выбирается с помощью PrintDlg(), а открывается для использования с помощью CreateDC().
285
13 февраля 2015 года
sadovoya
757 / / 19.11.2005
У меня напечатала только на PDF-принтер (PDF Creator), но что-то долго думала. На XPS не напечатала. На реальном принтере сразу вылетает с ошибкой. В очередь не ставит даже. Windows Vista.
По-умолчанию принтер реальный. С него и начинал. Файл NomenclatureList брал из изначального архива.


ОБНОВЛЕНИЕ ПОСТА
----------------------------------
С XPS-ом заработала и больше не тормозит с PDF принтером. Причина была в блокировке программы файрволом - доступ к памяти ему не понравился и он ее в песочницу поместил. Перенес в доверенные, больше не блокируется. Но с реальным принтером - все то же, также фатально вылетает с ошибкой.
285
13 февраля 2015 года
sadovoya
757 / / 19.11.2005
MSDN для CreateDC в случае принтеров рекомендует первый параметр NULL, поскольку lpszDriver игнорируется для принтеров. Вряд ли поможет, но можно попробовать.
6
13 февраля 2015 года
@pixo $oft
3.4K / / 20.09.2006
Цитата: sadovoya
MSDN для CreateDC в случае принтеров рекомендует первый параметр NULL, поскольку lpszDriver игнорируется для принтеров

Так я вроде и делал подобным образом (в архиве должна быть последняя версия кода). Это я вычитал, когда интересовался кодами ошибок функций. Как потом оказалось, они у меня ошибок не возвращали, но какая-то ошибка случалась в очереди печати.

Кстати, есть у тебя возможность отладить и посмотреть, в каком месте возникает ошибка, из-за которой приложение падает?

285
13 февраля 2015 года
sadovoya
757 / / 19.11.2005
В архиве HDC hDC=CreateDC((LPSTR)dn+dn->wDriverOffset... Я бы NULL попробовал заслать.
Посмотреть мне не получится в полной мере. Но ошибка явно в районе CreateDC, видимо сразу за ним.
Как запасной вариант: может на физический принтер лучше не рисовать, а временный файл делать и его печатать? Может он такое обилие команд не успевает отрабатывать. Еще можно задержку попробовать перед отрисовкой сделать.
285
13 февраля 2015 года
sadovoya
757 / / 19.11.2005
Дебаженье с подключением по пиду дало на крахе такое:
Program received signal SIGSEGV, Segmentation fault.
In wcslen () (C:\Windows\system32\msvcrt.dll)
Последнее, что происходит - постановка в очередь, потом крах.

Можешь выложить дебаговскую сборку с символами? Может удасться выудить что-то более понятное.

P.S. Самому мне собрать не удается, Code::Blocks нормально не импортирует ресурсы студийные. Сперва давала странную ошибку нехватки памяти - но это удалось победить, поменяв кодировку на UTF-8. Загадочная ситуация.. Но потом, стала просто на ресурсы как на сплошную синтаксическую ошибку ворчать :)
285
13 февраля 2015 года
sadovoya
757 / / 19.11.2005
А в журнале винды записалось следующее:
Сбойное приложение DocFolders.exe, версия 0.0.0.0, штамп времени 0x54dcbeb4, сбойный модуль msvcrt.dll, версия 7.0.6001.18000, штамп времени 0x4791a727, код исключения 0xc0000005, смещение ошибки 0x0000f3e7, ИД процесса 0x2d4, время запуска приложения 0x01d047ccc3e832d6.
6
13 февраля 2015 года
@pixo $oft
3.4K / / 20.09.2006
Так, ну это уже днём… А вот wcslen() меня удивила — я же её не использую :) Да и MSVCRT тоже. Выложу тебе .pdb к релизу, наверное — для дебага тебе надо дебажные версии MSVCR….dll иметь.
285
14 февраля 2015 года
sadovoya
757 / / 19.11.2005
Там дебажных библиотек потребуется возможно не одна :) Давай пока с .pdb попробую. Но экзешник релизный крохотный, скорее всего символы отладочные в нем не содержатся. Нет настроек сгенерить релиз без удаления лишних символов? У меня в компиляторе такое возможно.
6
14 февраля 2015 года
@pixo $oft
3.4K / / 20.09.2006
Вот версия с символами. От рантайма зависимостей там нет, поэтому приложил символы только приложения. Надеюсь, что там пути относительные, и всё подтянется ☺
Так-то да, я отключаю генерацию отладочной информации, но тут включил специально. Надеюсь, всё корректно.
Прикрепленные файлы:
51 Кб
Загрузок: 183
285
14 февраля 2015 года
sadovoya
757 / / 19.11.2005
Похоже надо заполнить структуру:
DOCINFO* lpDI=(DOCINFO*)HeapAlloc(hHeap,HEAP_ZERO_MEMORY,sizeof DOCINFO);
lpDI->lpszDocName="нечто"; lpDI->... и т.д.
319
14 февраля 2015 года
UserNet2008
691 / / 03.04.2010
Изначально не надо путать 0 с ПУСТО (NULL) весь код не проверял не моя есть задача
 
Код:
HDC hDC=CreateDC((LPSTR)dn+dn->wDriverOffset,LPSTR(dn)+dn->wDeviceOffset,0,dm);
Теперь так
 
Код:
HDC hDC=CreateDC((LPSTR)dn+dn->wDriverOffset,LPSTR(dn)+dn->wDeviceOffset,NULL,dm);
CreateDC и OpenPrinter это есть разные понятие. Т.Е что автомобиль заводить замком багажника.
CreateDC - создать контекст устройства (DC)
OpenPrinter - открыть заданный принтер
Вам нужно понять , что есть спулер
Выше я печатал код , на который Вы громко стучали по клаве так вот
В переменной phPrinter нужно убедиться , что нет begin space and end space.
И соотвественно для мня тема закрыто.
6
14 февраля 2015 года
@pixo $oft
3.4K / / 20.09.2006
Цитата: sadovoya
надо заполнить структуру DOCINFO

Откуда такое предположение? ☺
Просто в XPS же всё печатается и так, но если проблема только в отсутствии имени документа, то сделаю.

Цитата: UserNet2008
Изначально не надо путать 0 с ПУСТО (NULL)

Это одно и то же. Или NULL внезапно может не в 0 превратиться в данном коде? =)

Цитата: UserNet2008
CreateDC и OpenPrinter это есть разные понятие. Т.Е что автомобиль заводить замком багажника.

Рекомендую всё же почитать про CreateDC() и про печать от Microsoft.

319
14 февраля 2015 года
UserNet2008
691 / / 03.04.2010
Если Вы 0 с ПУСТО (NULL) не видите разнице об чём разговор идёт далее.
ВСЁ ТЕМА ДЛЯ МНЯ CLOSE.
P/S
Не надо бычеться. Тема началось с Очень нужна ваша помощь.
285
15 февраля 2015 года
sadovoya
757 / / 19.11.2005
Установил себе экспресс-версию студии 2010, может когда еще пригодится. Поправил в коде, как говорил:

 
Код:
...
if(hDC){
    DOCINFO* lpDI=(DOCINFO*)HeapAlloc(hHeap,HEAP_ZERO_MEMORY,sizeof DOCINFO);
    lpDI->lpszDocName="";//добавил
    lpDI->cbSize=sizeof(*lpDI);//добавил
    if(StartDoc(hDC,lpDI)>0){
...
Заработало. Только для "Корона" у меня немного залезает за поля (у слова "год" буква "д" не вмещается), прикрепляю скан распечатки.
6
15 февраля 2015 года
@pixo $oft
3.4K / / 20.09.2006
Спасибо за помощь! Отписаться смог только сейчас, но всё сделал уже днём. Мне хватило только размер DOCINFO указать ☺
Вот ведь засада, вроде не написано, что обязательно к заполнению, такая мелочь, но такие проблемы!

С форматированием буду разбираться, это уже второй вопрос =)
6
19 февраля 2015 года
@pixo $oft
3.4K / / 20.09.2006
Ребят, снова небольшая проблема. Есть один принтер, на котором почему-то моя программа не печатает, но дело в том, что надо, чтоб напечатала и на нём. Причём задание в очередь отправляется, висит там секунду и исчезает, а на принтере индикация, что есть что-то на печать. В то же время из того же ворда, допустим, печатает без проблем.
Я добавил проверку на ошибки функций открытия/закрытия документа/страницы, но они отрабатывают без ошибок. Не знаю, куда ещё копать.

Знаете кого-то, кто может ответить? Поделитесь с ним ссылкой.

Ваш ответ

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог