问题描述
我正在尝试使用 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。
想到了两种可能性:
- 该问题可能是由您的代码中除线程函数之外的其他内容引起的。
- 或者问题可能与您的 Twain 驱动程序有关。
为了排除第一种可能性,我建议创建一个小型测试项目,只创建一个类似的线程,不执行其他操作,并使用不同的扫描仪进行尝试。如果它导致所有扫描仪出现相同问题,请将测试项目(不是您的完整应用程序)发送至 support@leadtools.com,我们的支持工程师会为您进行测试。
如果问题只发生在特定的 Twain 驱动程序上,请尝试联系扫描仪的供应商,看看他们是否有更新的驱动程序。