Получение AccessViolationException на клиентских ПК

У кого-нибудь есть опыт использования функции EZTwain BARCODE_Recognize?

Мне интересно, почему я получаю AccessViolationException программа при попытке использовать библиотеку Dosadi EZTwain для распознавания штрих-кодов из отсканированных изображений.

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

С помощью программы ildasm.exe я обнаружил, что исключение возникает в этом методе моего служебного класса распознавания штрих-кода.

Изменить: мне интересно, может ли это быть связано с тем, что наши пользователи не настроены как администраторы? Поскольку у нас нет проблем с запуском здесь от имени администратора, то они получают это исключение при первом вызове этого метода GetBarcode?

Изменить: есть ли что-нибудь еще, что кто-нибудь еще должен увидеть в моем коде, чтобы помочь мне отследить эту проблему?

Ильдасм, в котором возникает ошибка, выглядит так. Ошибка в IL_00bb: ldloc.3, который является первым параметром «изображение».

//000053:                 count = EZTwain.BARCODE_Recognize(image, -1, -1);
IL_00bb:  ldloc.3
IL_00bc:  ldc.i4.m1
IL_00bd:  ldc.i4.m1
IL_00be:  call int32 Dosadi.EZTwain.EZTwain/*02000005*/::BARCODE_Recognize(native int,
                                                                           int32,
                                                                           int32) /* 060001E4 */
IL_00c3:  stloc.1

ПолучитьШтрихкод

public static string GetBarcode(Bitmap bImage, out BarcodeType barcodeType)
{
  barcodeType = BarcodeType.NotBarcode;
  string selectedBarcode = null;
  int count = 0;
  IntPtr hImage = IntPtr.Zero, image = IntPtr.Zero;
  List<string> barcodes = new List<string>();
  try
  {
    try
    {
      if (bImage.Width == 0 || bImage.Height == 0)
      {
        return null;
      }
      hImage = bImage.GetHbitmap();
      if (hImage == IntPtr.Zero)
      {
        return null;
      }
      image = EZTwain.DIB_FromBitmap(hImage, IntPtr.Zero);
    }
    catch (Exception ex)
    {
        logger.LogException(LogLevel.Debug, 
         "Exception in GetBarcode(): inner try-catch block", ex);
        throw;
    }
    finally
    {
        if (hImage != IntPtr.Zero)
            DeleteObject(hImage);
    }

    EZTwain.BARCODE_SetDirectionFlags(-1);
    count = EZTwain.BARCODE_Recognize(image, -1, -1);

    UtilDebug("Found {0} barcodes in image on first attempt.", count);

    for (int i = 0; i < count; i++)
    {
        barcodes.Add(EZTwain.BARCODE_Text(i));
    }

    foreach (string code in barcodes)
    {
        UtilDebug("Processing barcode \"{0}\".", code);

        if (ProcessBarcodeType(code) == BarcodeType.CoversheetBarcode || ProcessBarcodeType(code) == BarcodeType.RegularBarcode)
        {
            barcodeType = ProcessBarcodeType(code);
            selectedBarcode = code;
            UtilDebug("SelectedBarcode set to \"{0}\".", code);
            break;
        }
    }

  }
  catch (Exception ex)
  {
      logger.LogException(LogLevel.Debug, "Exception in GetBarcode(): outer try-catch block", ex);
      throw;
  }
  finally
  {
      if (image != IntPtr.Zero)
          EZTwain.DIB_Free(image);
      barcodes.Clear();
  }

  //Find one that is an ASI barcode before return
  return selectedBarcode;
}

person Zack    schedule 16.07.2013    source источник


Ответы (1)


То, как вы взаимодействуете с механизмом штрих-кода, мне кажется нормальным. Я предполагаю, что, возможно, механизм штрих-кода что-то давится внутри, может быть, что-то есть в этом изображении. Кстати, я думаю, что более новые версии набора инструментов EZTwain включают функцию, которая выполняет это преобразование из System.Drawing.Bitmap в «HDIB» EZTwain... да: DIB_FromImage. Он работает не так, как ваш код, возможно, стоит попробовать.

Я бы начал со сбора журнала (используя DosadiLog, приложение в вашем меню «Пуск» в EZTwain) на неисправной машине, собранный при воспроизведении сбоя. Либо разместите его здесь, либо, что более законно, откройте вопрос на портале поддержки Atalasoft и прикрепите его к нему.

Извините, что нам потребовалось так много времени, чтобы заметить ваше сообщение здесь, сейчас мы настроим лучший мониторинг.

person Spike0xff    schedule 25.07.2013
comment
Думаю, я уже говорил о том, как мы создаем HDIB, в других комментариях, но я просто хотел поблагодарить за попытку помочь мне даже после того, как мой вопрос был задан. Это заставляет меня думать, что я должен посмотреть, сможем ли мы перейти на версию 3.43 с eztwain.com, но я до сих пор не знаю, совместима ли она с нашим продуктом, созданным на основе версии 3.30, и нам нужно будет установить это. новая версия на всех машинах наших клиентов, я думаю. - person Zack; 01.08.2013
comment
Я не уверен, есть ли способ отправлять сообщения на SO, но у меня снова внезапно возникла почти та же проблема, и теперь у меня есть журнал Dosadi вместе с небольшой дополнительной информацией об ошибке здесь, в новом вопросе stackoverflow.com/questions/25895706/ - person Zack; 17.09.2014