2013-07-16 2 views
0

EZTwain의 BARCODE_Recognize 기능 사용 경험이있는 사람이 있습니까?클라이언트 PC에서 AccessViolationException 받기

Dosadi EZTwain 라이브러리를 사용하여 스캔 한 이미지의 바코드를 인식 할 때 내 프로그램에 AccessViolationException이 표시되는 이유가 궁금합니다.

이 프로그램은 개발자 환경에서 완벽하게 실행되므로 클라이언트 PC에서 실행될 때 문제의 원인을 정확히 추적하는 데 어려움을 겪고 있습니다.

필자는 ildasm.exe 프로그램을 사용하여 바코드 인식 유틸리티 클래스의이 방법에서 예외가 발생한 것으로 밝혀졌습니다.

편집

: 그것은 우리의 사용자가 관리자로 설정되지 함께 할 수있는 아무것도 할 수 있다면 궁금하네요? admin으로 여기에서 실행하는 데 전혀 문제가 없으므로이 GetBarcode 메서드를 처음 호출 할 때 예외가 발생합니다.

편집 :이 문제를 추적하는 데 도움이되는 다른 사람이 내 코드에서 볼 필요가 있습니까?

오류가 발생한 ildasm은 다음과 같습니다. 첫 번째 매개 변수 "image"인 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 

GetBarcode

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

답변

1

당신이 바코드 엔진과 상호 작용하는 방법이 나에게 확인을 보인다. 아마 바코드 엔진이 내부적으로 뭔가에 질식하고있는 것 같아요. 어쩌면 그 이미지에 관한 것이있을 것입니다. BTW EZTwain 툴킷의 최신 버전에는 System.Drawing.Bitmap에서 EZTwain의 'HDIB'로 변환하는 기능이 포함되어 있다고 생각합니다. 예 : DIB_FromImage. 코드와 다르게 작동하므로 시도해 볼 가치가 있습니다.

충돌을 재현하는 동안 수집 된 오류가 발생한 컴퓨터에서 로그 (EZTwain의 시작 메뉴에있는 응용 프로그램 인 DosadiLog 사용)를 수집하는 것으로 시작합니다. 여기에 게시하거나 아니면 더 합법적 인 곳에서 Atalasoft Support Portal에 문제를 열어 첨부하십시오.

죄송합니다. 귀하의 게시물을 여기까지 오랫동안 보았 기 때문에 더 나은 모니터링을 설정해 드리겠습니다.

+0

다른 의견에서 HDIB를 만드는 방식을 이미 언급 한 것 같지만, 제 질문에 대한 질문이 있은 후에도 도움을 주신 것에 대해 감사 드리고 싶습니다. eztwain.com에서 3.43 버전으로 업그레이드 할 수 있는지 확인해야한다고 생각 하긴하지만, 3.30 버전으로 빌드 된 우리 제품과 호환되는지 아직 모르겠다. 내 생각에 모든 고객 시스템의 새 버전. – Zack

+0

메시지를 보낼 수있는 방법이 있는지 모르겠지만, 갑자기 똑같은 문제가 다시 발생하고 Dosadi 로그가 새 질문에 대한 오류에 대한 자세한 정보와 함께 표시됩니다. http://stackoverflow.com/questions/25895706/client-pc-suddenly-getting-accessviolationexception-using-eztwain – Zack