C# 获取EZTwain条码并识别返回值-4

C# 获取EZTwain条码并识别返回值-4,c#,barcode,intptr,twain,hbitmap,C#,Barcode,Intptr,Twain,Hbitmap,我正在尝试使用EZTwain扫描库从扫描的图像中检索条形码,当我尝试调用EZTwain.BARCODE_Recognize(IntPtr,int,int)时,返回值为-4,EZTwain用户指南中没有相关说明 在EZTwain用户指南中,它列出了一些用作错误代码的返回值 条码识别 int条码识别(HDIB HDIB,int nMaxCount,int nType) 查找并识别给定图像中的条形码。 不要查找超过nMaxCount的条形码(-1表示“任意数字”)。 指定类型的条形码除外(-1表示“任

我正在尝试使用EZTwain扫描库从扫描的图像中检索条形码,当我尝试调用
EZTwain.BARCODE_Recognize(IntPtr,int,int)
时,返回值为-4,EZTwain用户指南中没有相关说明

在EZTwain用户指南中,它列出了一些用作错误代码的返回值

条码识别
int条码识别(HDIB HDIB,int nMaxCount,int nType)
查找并识别给定图像中的条形码。
不要查找超过nMaxCount的条形码(-1表示“任意数字”)。
指定类型的条形码除外(-1表示“任何支持的类型”)
您可以将“或”或“或”添加到一起,以告知识别器查找更多条形码类型
不止一个符号。返回值:
>找到0个条形码
0未找到条形码
-1条形码服务不可用。
-3无效或空图像
这里没有列出-4返回值,我不知道还有什么地方可以查看,因为我知道只有用户指南可以用于这个库的文档

这是我在返回-4代码时使用的代码

我确实打电话给EZTwain_SetVendorKey,但出于明显的原因,我没有打这个电话

我想知道这是否与我通过的
IntPtr
有关?文档中说,
callbarcode\u Recognize,将图像的句柄传递给它进行搜索
要查找的条形码修补程序的最大数量,以及条形码的掩码
要查找的类型(符号)。如果此函数找到任何条形码,则返回
正整数=找到的符号(条形码)计数。

我通过
IntPtr
I使用图像创建,并-1,-1使用所有条形码类型查找图像中的所有条形码

public static string GetBarcode(Bitmap image, out BarcodeType barcodeType, int percentThatCanBeNonWhitish = 2, int pixelTolerance = 10)
{
  // initialize barcodeType to appease the compiler
  barcodeType = BarcodeType.NotBarcode;

  BitmapData bd = image.LockBits(new Rectangle(0, 0, image.Width, image.Height),
    ImageLockMode.ReadWrite,
    image.PixelFormat);

  List<string> barcodes = new List<string>();

  EZTwain.BARCODE_SelectEngine(EZTwain.EZBAR_ENGINE_DOSADI);
  EZTwain.BARCODE_SetDirectionFlags(EZTwain.EZBAR_HORIZONTAL | EZTwain.EZBAR_VERTICAL);

  IntPtr imgPtr = image.GetHbitmap();
  if (EZTwain.DIB_IsBlank(imgPtr, .002) == true)
  {
    // Do nothing, the page is blank
  }
  else if (EZTwain.BARCODE_IsEngineAvailable(EZTwain.EZBAR_ENGINE_DOSADI))
  {
    int count;
    count = EZTwain.BARCODE_Recognize(imgPtr, -1, -1);
    for (int i = 0; i < count; i++)
    {
        barcodes.Add(EZTwain.BARCODE_Text(i));
    }
  }

  if (barcodes.Count != 0)
  {
    string barcode = barcodes[0];
    // sets the type to coversheet if it is blank, else it uses ProcessBarcodeType()
    barcodeType = image.IsBlank(percentThatCanBeNonWhitish, pixelTolerance) ? BarcodeType.CoversheetBarcode : ProcessBarcodeType(barcode);
    return barcode;
  }
  else
  {
    return null;
  }
}
public static string GetBarcode(位图图像,out-BarcodeType-BarcodeType,int-percentthatCanbennonWhitish=2,int-pixelTolerance=10)
{
//初始化条形码类型以安抚编译器
barcodeType=barcodeType.NotBarcode;
BitmapData bd=image.LockBits(新矩形(0,0,image.Width,image.Height),
ImageLockMode.ReadWrite,
图像(像素格式);
列表条形码=新列表();
EZTwain.BARCODE_SelectEngine(EZTwain.EZBAR_ENGINE_DOSADI);
EZTwain.BARCODE_设置方向标志(EZTwain.EZBAR_水平| EZTwain.EZBAR_垂直);
IntPtr imgPtr=image.GetHbitmap();
如果(EZTwain.DIB_为空(imgPtr.002)=真)
{
//什么也不做,这一页是空白的
}
else if(EZTwain.BARCODE_IsEngineAvailable(EZTwain.EZBAR_ENGINE_DOSADI))
{
整数计数;
计数=EZTwain.条形码识别(imgPtr,-1,-1);
for(int i=0;i

有人知道这个错误代码是什么意思吗?如果是这样的话,你是从哪里发现它的意思的呢?

这个错误仅仅意味着存在某种未指明的内存错误

扎克,你可能已经弄明白了。未来读者:

  • EZTwain工具包有一个更新版本,其中记录了-4返回代码。 但是,它只是说“内存错误(内存不足?)”——在这种情况下仍然没有多大帮助! Atalasoft在eztwain.com上提供了更新的工具包,任何有效的eztwain Pro 3许可证都将继续使用该工具包的3.x版本

  • EZTwain期望的图像参数(在其API中几乎无处不在)不仅仅是一个“图像句柄”,而是一个具体而精确的HDIB,它是包含压缩DIB=设备独立位图的内存块的全局句柄。这些都是Win32 API中古老的东西,只有这种特定的组合才是EZTwain可以理解的。不要因为看到这些表示为IntPtr而感到困惑——IntPtr可以容纳各种不同的底层本机对象。 我猜GetHBitmap不会返回HDIB,而是一个旧的Windows API称为HBITMAP的对象,它听起来很像,完全不能与HDIB互换

  • EZTwain包括许多用于与其他类型的内存中图像格式(如HBITMAP)进行转换的函数。我甚至认为在工具包的最新版本中,eztwain.cs文件具有一些往返于System.Drawing.Bitmap HDIB(表示为System.IntPtr)的函数


  • 1-我认为我们现在必须坚持使用3.30版本,因为我们在客户机器上安装了另一个使用该版本EZTwain库的产品,我不确定如果我们安装了3.43版本,该产品是否会继续工作。2-我现在明白了什么是IntPtr。它不是任何特定的对象类型,而是指向内存位置的指针。GetHBitmap方法说它返回一个GDI位图,但它由一个IntPtr表示,我可以将它从位图传递到DIB_,以便在它识别条形码时获得所需的HDIB eztwain。不管怎样,它现在可以工作了..3-第49页这里,第2点说“EZTwain可以使用DIB_FromBitmap将DDB(HBITMAP)转换为DIB”。所以我们使用GetHBitmap获取HBITMAP指针并将其传递给BARCODE_。听起来不错。重新升级:根据设计,任何更高版本的EZTwain都应该是3.30版本的替代品。当然,对于生产部署,它仍然要负责测试——首先在一台机器上进行测试,然后在使用多台扫描仪的情况下对每种型号的扫描仪进行测试。但我们努力工作,从不在一个小版本步骤中破坏正在工作的客户代码。