Проверка, подключен ли принтер - PullRequest
5 голосов
/ 16 сентября 2010

Есть ли способ в Windows (который работает в Windows CE), чтобы проверить, подключен ли принтер и взаимодействует ли с LPT1 в C ++?


[Изменить] Подробнее:

В настоящее время мы работаем с универсальным драйвером принтера для Windows CE - pcl.dll - передав его в CreateDC, чтобы получить DC для принтера.

Мы не можем позвонитьPrintDlg(), чтобы показать диалоговое окно печати, потому что оно «слишком сложно выглядит» , но мы также не можем вызвать его с помощью PD_RETURNDEFAULT, потому что мы делаемне хочу использовать принтер по умолчанию.Итак, мы вручную настраиваем структуру DEVMODE для передачи в CreateDC.

После того, как у нас есть DC, мы вызываем GetDeviceCaps(), чтобы получить информацию для принтера(например, ширину страницы и т. д.), затем StartPage() / EndPage() / ExtTextOut() для печати. ​​

Однако, если принтер не подключен, программа останавливается примерно на минуту, прежде чем выдать «Отменить / повторить / не выполнить?» диалоговое окно (я не знаю, в какой точке этого процесса он зависает).Другое программное обеспечение не останавливается при попытке печати, поэтому должен быть способом предотвращения этого ...

Ответы [ 6 ]

3 голосов
/ 21 сентября 2010

Когда вы работаете с принтерами в Windows, вы фактически никогда не предполагаете работать с портом напрямую, а только через интерфейс драйвера принтера. Это устареет от того, как общаться, и даст вам набор инструментов, который одинаков для всех принтеров, независимо от марки и порта.

Windows API дает вам много возможностей для извлечения дополнительной информации из драйвера. За мои 14 лет разработки принтеров Microsoft никогда не добавляла поддержку расширенного статуса принтера (хотя я не знаю, изменили ли они это в Windows 7). Нам, как и многим другим разработчикам принтеров, пришлось расширить драйвер принтера, чтобы предоставить больше информации приложению.

Вы должны спросить своего разработчика принтера, есть ли у него драйвер Windows CE. Я не уверен, что сообщение DEVICE_CHANGE генерируется при подключении / отключении параллельного принтера. Это подходит для USB-принтеров (не нужно возиться в реестре).

Подробнее о подсистеме печати можно прочитать здесь

2 голосов
/ 26 сентября 2010

Я бы также порекомендовал перечислять устройства, но вы могли бы попробовать следующие функции, чтобы увидеть, быстро ли он работает и изящно (в настоящее время у меня нет способа проверить это ...):

CreateFile("LPT1:", 0, 0, NULL, OPEN_EXISTING, ...);
DeviceIOControl(HANDLE, IOCTL_PARALLEL_STATUS, ...);

Возможно, это вернет ошибку лучше, чем попытка печати с помощью DC. Если это работает, не забудьте вызвать CloseHandle () для HANDLE, возвращенного из CreateFile, прежде чем открывать свой DC для печати. ​​

2 голосов
/ 22 сентября 2010

Одна из возможностей - перечислить устройства и проверить, перечисляется ли ваше устройство. Не уверен, работает ли он на WinCE

2 голосов
/ 22 сентября 2010

Вы пробовали использовать функции монитора порта Windows CE? http://msdn.microsoft.com/en-us/library/ms893529.aspx

2 голосов
/ 16 сентября 2010

Если это USB-принтер, вы можете просмотреть запись реестра драйвера USB-класса, чтобы узнать, подключен ли он, прежде чем продолжить.

0 голосов
/ 22 сентября 2010

Я не знаю, используете ли вы управляемый код .NET или нет, но вот ссылка на то, как использовать LPT-порты с использованием VB.NET (который может быть преобразован в C ++ .NET управляемого): http://support.microsoft.com/default.aspx?scid=kb;en-us;823179

Надеюсь, это поможет!

...