This project has moved. For the latest updates, please go here.

Проблемы со сканером HP 1536

Nov 27, 2014 at 6:42 AM
Edited Nov 27, 2014 at 7:08 AM
Привет, я в очередной раз прошу помощи, или указания направления копания.

Имеется сканер HP 1536, с которым не работает моя программа, при попытке открыть сканер, метод _twain32.OpenDataSource() возвращает false. При этом на том же компьютере, с другим сканером такой проблемы нет. С этим сканером на другом компьютере возникла та же проблема. Предположительно проблема связана с конкретный драйвером сканера.

Моя программа использует интерфейс GTK#, по сути запускает сканирование без родительского окна, как это делает 3-й пример. Я проверил, примеры 1 и 2 работают с этим сканером, то есть источник открывается и функция OpenDataSource() возвращает true, а 3-й пример где запуск осуществляется из консоли, не работает, пишет не могу открыть источник.

Я предположил что дело в передаче родительского окна, и из кода первого примера убрал передачу this.components в конструктор и закоментирова this._twain.Parent = this; передачу родительского окна. Но первый пример продолжил работать.

Как еще понять, что ему надо, я не знаю. Сейчас читаю спецификацию, но идей не появилось.
Еще внутри библиотеки TwRC _rc=this._dsmEntry.DsmInvoke(this.AppId,TwDG.Control,TwDAT.Identity,TwMSG.OpenDS,ref this._srcds); возвращает TwRC.Failure

Если есть идеи, как починить буду благодарен.
Coordinator
Nov 27, 2014 at 8:20 AM
Добрый день, Gankov!
Более подробное описание ошибки можно попробовать получить, если (в методе Twain32.OpenDataSource) после строчки
TwRC _rc=this._dsmEntry.DsmInvoke(this.AppId,TwDG.Control,TwDAT.Identity,TwMSG.OpenDS,ref this._srcds);
написать вот этот код
if(_rc!=TwRC.Success) {
    throw new TwainException(this._GetTwainStatus(),_rc);
}
Если переменная _rc будет равна TwRC.Failure, то мы получим исключение с описание ошибки.
Разница между примерами 1, 2 и 3, Вашей программой заключается в том, что в примере 3 и в Вашей программе используется размещенная среда, т.е. цикл обработки сообщений windows отсутствует (он необходим для TWAIN 1.x). Поэтому можно попробовать использовать TWAIN 2.x: до вызова метода Twain32.OpenDSM() необходимо установить значение свойства Twain32.IsTwain2Enable=true, а после вызова метода Twain32.OpenDSM() необходимо проверить значение свойства Twain32.IsTwain2Supported
Nov 27, 2014 at 11:52 AM
написать вот этот код
if(_rc!=TwRC.Success) {
    throw new TwainException(this._GetTwainStatus(),_rc);
}
Возвращает "DG DAT MSG out of expected sequence."
Если переменная _rc будет равна TwRC.Failure, то мы получим исключение с описание ошибки.
Поэтому можно попробовать использовать TWAIN 2.x: до вызова метода Twain32.OpenDSM() необходимо установить значение свойства Twain32.IsTwain2Enable=true, а после вызова метода Twain32.OpenDSM() необходимо проверить значение свойства Twain32.IsTwain2Supported
Попробовал, не помогло. Twain32.IsTwain2Supported возвращает true;
Coordinator
Nov 27, 2014 at 12:56 PM
А метод Twain32.OpenDSM() выполнился успешно (вернул true)?
Nov 27, 2014 at 1:19 PM
SARAFF wrote:
А метод Twain32.OpenDSM() выполнился успешно (вернул true)?
Да, метод выполнялся успешно. Список сканеров получали без проблем.
После долгих мучений похоже нашли в чем дело. Если у главного процесса для метода Main установить атрибут [STAThread] то все работает. Завтра будем проверять окончательный результат уже на нашем приложении.
Nov 28, 2014 at 12:35 PM
Предыдущую проблему решили, но выяснилась еще одна.
Теперь сканирование никогда не заканчивается, то есть после вызова функции Acquire в библиотеки, появляется окно сканирование, сканирование проходит успешно, но библиотека не создает никаких событий, в том числе AcquireCompleted, но так же не вызываются события SetupMemXferEvent и MemXferEvent при использовании режима TwSX.Memory, и управление не выходит из фунции Acquire, программа тупо висит, после окончания сканирования.

Дебагером посмотрел что в примере 3 (консольное приложение) срабатывает следующее условие:
                                if(!Application.MessageLoop) {
                                    Application.Run(this._context=new ApplicationContext());
                                }
исполнение уходит в Application.Run и отуда не возвращается.
В примере 1 Application.MessageLoop = true и поэтому Application.Run не вызывается.

Но фишка в том что по идеи события должны былы вызываться до, этого кода, то есть удаление вызова Application.Run не решает проблемы.

Есть идеи как починить?
Coordinator
Nov 28, 2014 at 9:01 PM
Добрый день, Gankov!
Похоже, что эта проблема уже исправлена в последней версии исходников. Поэтому я предлагаю скачать последнюю версию исходников.
Dec 1, 2014 at 7:05 AM
SARAFF, к сожажению не помогло. Скомпилировал библиотеку из последних исходников. Все тоже самое, зависает после окончания сканирования. События не вызываются.
Coordinator
Dec 1, 2014 at 8:21 AM
Добрый день, Gankov!
Тогда попробуйте поставить точку останова в методе Twain32._DisableDataSource и посмотреть, что в нем (и после него) происходит.
Coordinator
Dec 14, 2014 at 4:08 PM
Добрый день, Gankov!
Удалось ли Вам решить проблему с зависанием сканирования?
Dec 15, 2014 at 6:08 AM
К сожалению, нет. Победить не получилось. Разбираться с проблемой на компьютрере клиента пока нет возможности, другого сканера HP не нашлось. Этот мы к себе забрать не можем. Пока ситуация в подвешенном состоянии. Было принято решение что клиент купит МФУ самсунг, с которым таких проблем не наблюдалось, после этого мы сможем продолжить разбираться с HP, но по сути клиент уже будет работать с нашей программой, и это не будет приоритетной задачей.
Dec 15, 2014 at 6:40 AM
Кстати, пока пытались найте сканер HP, удалось проверить еще на одном МФУ от HP, там ситуация с зависанием такая же. Похоже это беда для свего ряда. Поэтому мы в любом случае заинтересованы в решении.
Coordinator
Dec 16, 2014 at 4:38 PM
Edited Dec 16, 2014 at 4:41 PM
Добрый день, Gankov!
Я попытался воспроизвести Вашу проблему используя пример Saraff.Twain.Sample3 и МФУ HP LaserJet 3050. Могу сказать следующее:
  • Использование STAThreadAttribute (т.е. апартаментов STA) очень важно, иначе окна источника данных (драйвера сканера) могут не появиться;
  • "родной" TWAIN-драйвер от HP чаще всего не работает (или вообще, или зависает в процессе сканирования). Но зато, как правило, работает WIA драйвер (т.е. TWAIN on WIA). Но это возможно только при использовании TWAIN 1.x. При использовании TWAIN 2.x драйвер TWAIN on WIA почему-то не виден (по крайней мере у меня).
  • HP LaserJet 3050 нормально работает только с конкретными параметрами сканирования (например, разрешение 200 dpi и тип пикселей RGB, или разрешение 100 dpi и тип пикселей Gray). В других случаях изображение получается искаженным (перекошенным) или сканирование подвисает. Возможно, аналогичное поведение имеет место и на других моделях HP.
Так же рекомендую использовать альтернативный интерфейс вместо интерфейса источника данных (Alternative User Interfaces).
Описанное не зависит от приложения в котором выполняется сканирование, т.е. одинаковый результат получается при использовании Saraff.Twain.Sample3, IrfanView, Twacker.
Coordinator
Dec 18, 2014 at 6:49 PM
Добрый день, Gankov!
Мне удалось найти МФУ HP LaserJet Pro M1536dnf и протестировать на нем модифицированный Saraff.Twain.Sample3. Получились следующие результаты:
  • ShowUI = N;
D:\Samples>Saraff.Twain.Sample3.exe
Saraff.Twain.NET 1.0.14.403
Copyright c SARAFF 2011

ShowUI [Y/n]: n
ShowUI = N
IsTwain2Enable [y/N]:
IsTwain2Enable = N

Select Data Source:
0: HP LJ M1530 Scan TWAIN
1: WIA-HP LJ M1530 MFP Series Scan
[0]:
Data Source: HP LJ M1530 Scan TWAIN

Select Resolution:
0: 75 dpi
1: 100 dpi
2: 150 dpi
3: 200 dpi
4: 300 dpi
5: 600 dpi
6: 1200 dpi
[0]: 4
Resolution: 300

Select Pixel Type:
0: BW
1: Gray
2: RGB
[2]: 2
Pixel Type: RGB

Saved in: C:\Documents and Settings\user\Рабочий стол\tmp8E.jpg

Acquire Completed.

D:\Samples>
  • ShowUI = Y;
D:\Samples>Saraff.Twain.Sample3.exe
Saraff.Twain.NET 1.0.14.403
Copyright c SARAFF 2011

ShowUI [Y/n]:
ShowUI = Y
IsTwain2Enable [y/N]:
IsTwain2Enable = N

Select Data Source:
0: HP LJ M1530 Scan TWAIN
1: WIA-HP LJ M1530 MFP Series Scan
[0]:
Data Source: HP LJ M1530 Scan TWAIN

Saved in: C:\Documents and Settings\user\Рабочий стол\tmp97.jpg

Acquire Completed.

D:\Samples>
Т.о. все прекрасно работает.
Marked as answer by SARAFF on 1/15/2015 at 10:48 AM
Dec 19, 2014 at 8:22 AM
SARAFF Спасибо, без UI вообще не пробовали.
На следующей неделе будем у клиента, поверим, новый третий пример, как он работает. К сожалению МФУ к себе забрать не получилось. МФУ точно такое же LaserJet Pro M1536dnf.