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