微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

无法设置扫描仪功能,因为 L_TwainStartCapsNeg 返回错误 -84

如何解决无法设置扫描仪功能,因为 L_TwainStartCapsNeg 返回错误 -84

我正在尝试使用 Leadtools API 版本 21 来自动扫描一些文档,这里是我所做的 sudo 代码(它在辅助线程中运行,解锁已在主线程中完成):

void CheckRetCode(int rc)
{
    if (SUCCESS != rc)
    {
        L_TCHAR errMsg[1024];

        memset(errMsg,sizeof(errMsg));
        L_GetFriendlyErrorMessage(rc,errMsg,1024,L_FALSE);

        throw TLeadException(errMsg,rc);
    }
} 
void OnThreadExecute(void)
{
    HTWAINSESSION hSession = nullptr;
    APPLICATIONDATA appData;
    L_INT nRet;
    L_TCHAR pszTwnSourceName[1024];
    LTWAINSOURCE sInfo;

    memset(&appData,sizeof(APPLICATIONDATA));
    appData.uStructSize = sizeof(APPLICATIONDATA);
    appData.hWnd = hWnd;// hWnd is valid handle of my main window
    appData.uLanguage = TWLG_ENGLISH_USA;
    appData.uCountry = TWCY_USA;
    wcscpy(appData.szManufacturerName,L"MyCompanyName");
    wcscpy(appData.szAppProductFamily,L"MyProductName");
    wcscpy(appData.szAppName,appData.szAppProductFamily);
    wcscpy(appData.szVersionInfo,L"Version 0.1.0.1");
    nRet = L_TwainInitSession2(&hSession,&appData,LTWAIN_INIT_MULTI_THREADED);
    CheckRetCode(nRet);// the exception gets catched elsewhere but no error reported here
    memset(pszTwnSourceName,sizeof(pszTwnSourceName));
    wcscpy(pszTwnSourceName,L"EPSON Artisan837/PX830"); // the name of the scanner is verifyed
    sInfo.uStructSize = sizeof(LTWAINSOURCE);
    sInfo.pszTwainSourceName = pszTwnSourceName;
    CheckRetCode(L_TwainSelectSource(hSession,&sInfo)); // No error reported here
    CheckRetCode(L_TwainStartCapsNeg(hSession)); // in here I get the return value -84 which is reported as "TWAIN DS or DSM reported error,app shouldn't (no need for your app to report the error)."
    // the rest of the code but we cannot get there since above code reports error
}

谁能告诉我我做错了什么?有没有我在这里遗漏的步骤?

编辑
函数 L_TwainSelectSource() 不努力确保提供的源是有效的,甚至不返回错误。结果,如果您将选定的源设置为垃圾名称,它将表现为接受它。从那时起,如果您尝试获取/设置任何内容或尝试获取图像,则每个函数都会返回 -84

谢谢 山姆

解决方法

为了测试你的代码,我把主窗口的句柄放在一个全局变量中:

globalhWnd = hWnd;

并修改您的函数以使用该句柄,如下所示:

void OnThreadExecute(void *)
{
...
appData.hWnd = globalhWnd; // hWnd is valid handle of my main window
...
}

然后从主程序为它创建一个线程,如下所示:

globalhWnd = hWnd;
_beginthread(OnThreadExecute,0);

我使用 5 个不同的 Twain 来源进行了尝试:2 个虚拟扫描仪和 3 个物理扫描仪(其中一个是旧的 Epson)。从线程内调用 L_TwainStartCapsNeg() 时,所有 5 个驱动程序都返回了 SUCCESS。

想到了两种可能性:

  1. 该问题可能是由您的代码中除线程函数之外的其他内容引起的。
  2. 或者问题可能与您的 Twain 驱动程序有关。

为了排除第一种可能性,我建议创建一个小型测试项目,只创建一个类似的线程,不执行其他操作,并使用不同的扫描仪进行尝试。如果它导致所有扫描仪出现相同问题,请将测试项目(不是您的完整应用程序)发送至 support@leadtools.com,我们的支持工程师会为您进行测试。

如果问题只发生在特定的 Twain 驱动程序上,请尝试联系扫描仪的供应商,看看他们是否有更新的驱动程序。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。