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

Cannot set Scanner Capability because L_TwainStartCapsNeg returns error -84

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

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

        memset(errMsg, 0, 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, 0, 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, 0, 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
}

谁能告诉我我做错了什么?我在这里遗漏了一个步骤吗?

Edit
函数 L_TwainSelectSource() 不努力确保提供的源有效,甚至 return 没有错误.因此,如果您将选定的源设置为垃圾名称,它将表现得好像接受了它一样。从那时起,如果您尝试 Get/Set 任何东西或尝试获取图像,每个函数 returns -84.

谢谢 山姆

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

globalhWnd = hWnd;

并修改您的函数以像这样使用该句柄:

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

然后在主程序中为其创建一个线程,如下所示:

globalhWnd = hWnd;
_beginthread(OnThreadExecute, 0, 0);

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

想到两种可能性:

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

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

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