У кого-нибудь есть опыт использования функции 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;
}