-1

我正在尝试使用 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
}

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

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

谢谢山姆

4

1 回答 1

0

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

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. 或者问题可能特定于您的吐温驱动程序。

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

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

于 2021-01-06T16:59:30.757 回答