0

有人有使用 EZTwain 的 BARCODE_Recognize 功能的经验吗?

我想知道为什么AccessViolationException在尝试使用Dosadi EZTwain库从扫描图像中识别条形码时,我的程序中出现了一个。

该程序在我们的开发环境中完美运行,因此当它在客户端 PC 上运行时,我很难找出问题的确切原因。

我通过使用 ildasm.exe 程序发现异常源于我的条形码识别实用程序类的这种方法。

编辑:我想知道这是否与我们的用户未设置为管理员有关?既然我们在这里以管理员身份运行它完全没有问题,那么他们第一次调用这个 GetBarcode 方法时就会得到这个异常?

编辑:还有其他人需要从我的代码中看到什么来帮助我找出这个问题吗?

发生错误的 ildasm 如下所示。错误出现在 IL_00bb: ldloc.3 上,它是第一个参数“image”。

//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;
}
4

1 回答 1

1

您与条形码引擎交互的方式对我来说看起来不错。我猜可能条形码引擎在内部阻塞了某些东西,也许该图像有某些东西。顺便说一句,我认为 EZTwain 工具包的较新版本包括一个从 System.Drawing.Bitmap 转换为 EZTwain 的“HDIB”的函数......是的:DIB_FromImage。它的工作方式与您的代码不同,可能值得一试。

我将首先在故障机器上收集日志(使用 DosadiLog,EZTwain 下开始菜单中的一个应用程序),在重现崩溃时收集。要么在此处发布,要么 - 可能更合法,在 Atalasoft 支持门户上打开一个问题并将其附加到该问题上。

抱歉,我们花了这么长时间才注意到您的帖子,我们现在将设置更好的监控。

于 2013-07-25T20:50:52.400 回答