增加twain自定义功能的接口

This commit is contained in:
luoliangyi 2023-05-12 15:14:18 +08:00
parent 27d40d543e
commit c2318606f3
5 changed files with 347 additions and 56 deletions

View File

@ -14,6 +14,13 @@ HGTwain_CloseDS
HGTwain_GetDSName
HGTwain_GetDSDeviceName
HGTwain_GetDSDeviceCustomInfo
HGTwain_LoginDS
HGTwain_LogoutDS
HGTwain_ClearDSRollerCount
HGTwain_GetDSDriverLogPath
HGTwain_ClearDSDriverLog
HGTwain_GetDSDeviceLogPath
HGTwain_ClearDSDeviceLog
HGTwain_EnableDSUIOnly
HGTwain_EnableDS
HGTwain_EnableDSWithSingleScan

View File

@ -180,6 +180,83 @@ HGResult HGAPI HGTwain_GetDSDeviceCustomInfo(HGTwainDS ds, HGTwainDeviceCustomIn
return twainDSImpl->GetDeviceCustomInfo(info);
}
HGResult HGAPI HGTwain_LoginDS(HGTwainDS ds, const HGChar *user, const HGChar *pwd)
{
if (NULL == ds)
{
return HGBASE_ERR_INVALIDARG;
}
HGTwainDSImpl* twainDSImpl = (HGTwainDSImpl*)ds;
return twainDSImpl->Login(user, pwd);
}
HGResult HGAPI HGTwain_LogoutDS(HGTwainDS ds)
{
if (NULL == ds)
{
return HGBASE_ERR_INVALIDARG;
}
HGTwainDSImpl* twainDSImpl = (HGTwainDSImpl*)ds;
return twainDSImpl->Logout();
}
HGResult HGAPI HGTwain_ClearDSRollerCount(HGTwainDS ds)
{
if (NULL == ds)
{
return HGBASE_ERR_INVALIDARG;
}
HGTwainDSImpl* twainDSImpl = (HGTwainDSImpl*)ds;
return twainDSImpl->ClearRollerCount();
}
HGResult HGAPI HGTwain_GetDSDriverLogPath(HGTwainDS ds, HGChar *path, HGUInt maxLen)
{
if (NULL == ds)
{
return HGBASE_ERR_INVALIDARG;
}
HGTwainDSImpl* twainDSImpl = (HGTwainDSImpl*)ds;
return twainDSImpl->GetDriverLogPath(path, maxLen);
}
HGResult HGAPI HGTwain_ClearDSDriverLog(HGTwainDS ds)
{
if (NULL == ds)
{
return HGBASE_ERR_INVALIDARG;
}
HGTwainDSImpl* twainDSImpl = (HGTwainDSImpl*)ds;
return twainDSImpl->ClearDriverLog();
}
HGResult HGAPI HGTwain_GetDSDeviceLogPath(HGTwainDS ds, HGChar *path, HGUInt maxLen)
{
if (NULL == ds)
{
return HGBASE_ERR_INVALIDARG;
}
HGTwainDSImpl* twainDSImpl = (HGTwainDSImpl*)ds;
return twainDSImpl->GetDeviceLogPath(path, maxLen);
}
HGResult HGAPI HGTwain_ClearDSDeviceLog(HGTwainDS ds)
{
if (NULL == ds)
{
return HGBASE_ERR_INVALIDARG;
}
HGTwainDSImpl* twainDSImpl = (HGTwainDSImpl*)ds;
return twainDSImpl->ClearDeviceLog();
}
HGResult HGAPI HGTwain_EnableDSUIOnly(HGTwainDS ds, HWND parent, HGDSCloseReqFunc eventFunc, HGPointer eventParam)
{
if (NULL == ds)

View File

@ -15,16 +15,22 @@ HG_DECLARE_HANDLE(HGTwainDS);
/* TWAIN设备自定义信息 */
typedef struct
{
HGUShort vid;
HGUShort pid;
HGChar model[16];
HGChar type[16];
HGChar sn[32];
HGChar fwVer[32];
HGChar ip[32];
HGChar mac[32];
HGUInt rollerCount;
HGUInt totalCount;
HGInt vid; // VID
HGInt pid; // PID
HGChar sn[32]; // 设备序列号
HGChar type[32]; // 设备型号
HGChar fwVer[32]; // 设备固件版本号
HGChar ip[32]; // 设备IP
HGChar mac[32]; // 设备MAC
HGChar driverVer[32]; // 驱动版本号
HGChar vendor[32]; // 制造商
HGChar copyright[32]; // 版权信息
HGChar comUrl[128]; // 公司网址
HGChar comTel[32]; // 公司电话
HGChar comAddr[256]; // 公司地址
HGChar comGps[256]; // 公司地图定位
HGInt rollerCount; // 滚轴计数
HGInt totalCount; // 历史张数
}HGTwainDeviceCustomInfo;
#pragma pack(pop)
@ -58,6 +64,20 @@ HGEXPORT HGResult HGAPI HGTwain_GetDSDeviceName(HGTwainDS ds, HGChar* name, HGUI
HGEXPORT HGResult HGAPI HGTwain_GetDSDeviceCustomInfo(HGTwainDS ds, HGTwainDeviceCustomInfo *info);
HGEXPORT HGResult HGAPI HGTwain_LoginDS(HGTwainDS ds, const HGChar *user, const HGChar *pwd);
HGEXPORT HGResult HGAPI HGTwain_LogoutDS(HGTwainDS ds);
HGEXPORT HGResult HGAPI HGTwain_ClearDSRollerCount(HGTwainDS ds);
HGEXPORT HGResult HGAPI HGTwain_GetDSDriverLogPath(HGTwainDS ds, HGChar *path, HGUInt maxLen);
HGEXPORT HGResult HGAPI HGTwain_ClearDSDriverLog(HGTwainDS ds);
HGEXPORT HGResult HGAPI HGTwain_GetDSDeviceLogPath(HGTwainDS ds, HGChar *path, HGUInt maxLen);
HGEXPORT HGResult HGAPI HGTwain_ClearDSDeviceLog(HGTwainDS ds);
HGEXPORT HGResult HGAPI HGTwain_EnableDSUIOnly(HGTwainDS ds, HWND parent, HGDSCloseReqFunc eventFunc, HGPointer eventParam);
HGEXPORT HGResult HGAPI HGTwain_EnableDS(HGTwainDS ds, HGBool showUI, HWND parent, HGDSCloseReqFunc eventFunc, HGPointer eventParam,

View File

@ -404,7 +404,7 @@ HGResult HGTwainDSImpl::GetDeviceName(HGChar* name, HGUInt maxLen)
return HGBASE_ERR_INVALIDARG;
}
return HGBASE_ERR_NOTIMPL;
return GetCapStr255(0x8854, name, maxLen);
}
HGResult HGTwainDSImpl::GetDeviceCustomInfo(HGTwainDeviceCustomInfo *info)
@ -416,19 +416,111 @@ HGResult HGTwainDSImpl::GetDeviceCustomInfo(HGTwainDeviceCustomInfo *info)
memset(info, 0, sizeof(HGTwainDeviceCustomInfo));
HGChar strValue[256] = {0};
GetCap(CAP_SERIALNUMBER, strValue, 256);
strcpy(info->sn, strValue);
strValue[0] = 0;
GetCap(0x8025, strValue, 256);
strcpy(info->fwVer, strValue);
strValue[0] = 0;
GetCap(0x8200, strValue, 256);
strcpy(info->ip, strValue);
GetCapInt32(0x8852, &info->vid);
GetCapInt32(0x8853, &info->pid);
GetCapStr255(CAP_SERIALNUMBER, info->sn, 32);
GetCapStr255(0x8855, info->type, 32);
GetCapStr255(0x8025, info->fwVer, 32);
GetCapStr255(0x8200, info->ip, 32);
GetCapStr255(0x884A, info->driverVer, 32);
GetCapStr255(0x884B, info->vendor, 32);
GetCapStr255(0x884C, info->copyright, 32);
GetCapStr255(0x884D, info->comUrl, 128);
GetCapStr255(0x884E, info->comTel, 32);
GetCapStr255(0x884F, info->comAddr, 256);
GetCapStr255(0x8850, info->comGps, 256);
GetCapInt32(0x9902, &info->rollerCount);
GetCapInt32(0x8849, &info->totalCount);
return HGBASE_ERR_OK;
}
struct LoginType
{
TW_UINT16 ItemType;
TW_UINT32 NumItems;
TW_STR32 Value[2];
};
HGResult HGTwainDSImpl::Login(const HGChar *user, const HGChar *pwd)
{
if (NULL == user || strlen(user) >= sizeof(TW_STR32)
|| NULL == pwd || strlen(pwd) >= sizeof(TW_STR32))
{
return HGBASE_ERR_INVALIDARG;
}
TW_CAPABILITY twCap;
twCap.Cap = (TW_UINT16)0x9900;
twCap.ConType = TWON_ARRAY;
twCap.hContainer = GlobalAlloc(GHND, sizeof(LoginType));
if (NULL == twCap.hContainer)
{
return HGBASE_ERR_FAIL;
}
LoginType *pVal = (LoginType *)GlobalLock(twCap.hContainer);
assert(NULL != pVal);
pVal->ItemType = TWTY_STR32;
pVal->NumItems = 2;
strcpy(pVal->Value[0], user);
strcpy(pVal->Value[1], pwd);
GlobalUnlock(twCap.hContainer);
USHORT ret = m_dsmImpl->m_pDSMProc(&m_dsmImpl->m_AppId, &m_iden, DG_CONTROL, DAT_CAPABILITY, MSG_SET, &twCap);
GlobalFree(twCap.hContainer);
return (TWRC_SUCCESS == ret) ? HGBASE_ERR_OK : HGTWAIN_ERR_FAIL;
}
HGResult HGTwainDSImpl::Logout()
{
TW_CAPABILITY twCap;
twCap.Cap = (TW_UINT16)0x9901;
twCap.ConType = TWON_ARRAY;
twCap.hContainer = GlobalAlloc(GHND, sizeof(LoginType));
if (NULL == twCap.hContainer)
{
return HGBASE_ERR_FAIL;
}
LoginType *pVal = (LoginType *)GlobalLock(twCap.hContainer);
assert(NULL != pVal);
pVal->ItemType = TWTY_STR32;
pVal->NumItems = 2;
memset(pVal->Value[0], 0, sizeof(pVal->Value[0]));
memset(pVal->Value[0], 0, sizeof(pVal->Value[1]));
GlobalUnlock(twCap.hContainer);
USHORT ret = m_dsmImpl->m_pDSMProc(&m_dsmImpl->m_AppId, &m_iden, DG_CONTROL, DAT_CAPABILITY, MSG_SET, &twCap);
GlobalFree(twCap.hContainer);
return (TWRC_SUCCESS == ret) ? HGBASE_ERR_OK : HGTWAIN_ERR_FAIL;
}
HGResult HGTwainDSImpl::ClearRollerCount()
{
return ResetCapInt32(0x9902);
}
HGResult HGTwainDSImpl::GetDriverLogPath(HGChar *path, HGUInt maxLen)
{
return GetCapStr255(0x9903, path, maxLen);
}
HGResult HGTwainDSImpl::ClearDriverLog()
{
return ResetCapStr255(0x9903);
}
HGResult HGTwainDSImpl::GetDeviceLogPath(HGChar *path, HGUInt maxLen)
{
return GetCapStr255(0x9904, path, maxLen);
}
HGResult HGTwainDSImpl::ClearDeviceLog()
{
return ResetCapStr255(0x9904);
}
HGResult HGTwainDSImpl::EnableUIOnly(HWND parent, HGDSCloseReqFunc eventFunc, HGPointer eventParam)
{
TW_USERINTERFACE twUI;
@ -474,13 +566,13 @@ HGResult HGTwainDSImpl::EnableWithSingleScan(HGDSCloseReqFunc eventFunc, HGPoint
HGDSImageFunc imageFunc, HGPointer imageParam)
{
HGInt oldXferCount = -1;
HGResult ret = GetCap(CAP_XFERCOUNT, &oldXferCount);
HGResult ret = GetCapInt32(CAP_XFERCOUNT, &oldXferCount);
if (HGBASE_ERR_OK != ret)
{
return ret;
}
ret = SetCap(CAP_XFERCOUNT, 1);
ret = SetCapInt32(CAP_XFERCOUNT, 1);
if (HGBASE_ERR_OK != ret)
{
return ret;
@ -514,7 +606,7 @@ HGResult HGTwainDSImpl::Disable()
if (m_singleScan)
{
SetCap(CAP_XFERCOUNT, m_oldXferCount);
SetCapInt32(CAP_XFERCOUNT, m_oldXferCount);
}
m_singleScan = FALSE;
@ -528,35 +620,57 @@ HGResult HGTwainDSImpl::Disable()
return HGBASE_ERR_OK;
}
HGResult HGTwainDSImpl::SetCap(HGUInt cap, HGInt value)
struct CapInt32Type
{
TW_UINT16 ItemType;
TW_INT32 Value;
};
HGResult HGTwainDSImpl::SetCapInt32(HGUInt cap, HGInt value)
{
TW_CAPABILITY twCap;
twCap.Cap = (TW_UINT16)cap;
twCap.ConType = TWON_ONEVALUE;
twCap.hContainer = GlobalAlloc(GHND, sizeof(TW_ONEVALUE));
twCap.hContainer = GlobalAlloc(GHND, sizeof(CapInt32Type));
if (NULL == twCap.hContainer)
{
return HGBASE_ERR_FAIL;
}
pTW_ONEVALUE pVal = (pTW_ONEVALUE)GlobalLock(twCap.hContainer);
CapInt32Type* pVal = (CapInt32Type*)GlobalLock(twCap.hContainer);
assert(NULL != pVal);
pVal->ItemType = TWTY_INT32;
pVal->Item = (TW_UINT32)value;
pVal->Value = value;
GlobalUnlock(twCap.hContainer);
USHORT ret = m_dsmImpl->m_pDSMProc(&m_dsmImpl->m_AppId, &m_iden, DG_CONTROL, DAT_CAPABILITY, MSG_SET, &twCap);
if (TWRC_SUCCESS != ret)
{
GlobalFree(twCap.hContainer);
return HGTWAIN_ERR_FAIL;
}
GlobalFree(twCap.hContainer);
return HGBASE_ERR_OK;
GlobalFree(twCap.hContainer);
return (TWRC_SUCCESS == ret) ? HGBASE_ERR_OK : HGTWAIN_ERR_FAIL;
}
HGResult HGTwainDSImpl::GetCap(HGUInt cap, HGInt* value)
HGResult HGTwainDSImpl::ResetCapInt32(HGUInt cap)
{
TW_CAPABILITY twCap;
twCap.Cap = (TW_UINT16)cap;
twCap.ConType = TWON_ONEVALUE;
twCap.hContainer = GlobalAlloc(GHND, sizeof(CapInt32Type));
if (NULL == twCap.hContainer)
{
return HGBASE_ERR_FAIL;
}
CapInt32Type* pVal = (CapInt32Type*)GlobalLock(twCap.hContainer);
assert(NULL != pVal);
pVal->ItemType = TWTY_INT32;
pVal->Value = 0;
GlobalUnlock(twCap.hContainer);
USHORT ret = m_dsmImpl->m_pDSMProc(&m_dsmImpl->m_AppId, &m_iden, DG_CONTROL, DAT_CAPABILITY, MSG_RESET, &twCap);
GlobalFree(twCap.hContainer);
return (TWRC_SUCCESS == ret) ? HGBASE_ERR_OK : HGTWAIN_ERR_FAIL;
}
HGResult HGTwainDSImpl::GetCapInt32(HGUInt cap, HGInt* value)
{
if (NULL == value)
{
@ -567,24 +681,81 @@ HGResult HGTwainDSImpl::GetCap(HGUInt cap, HGInt* value)
twCap.Cap = (TW_UINT16)cap;
twCap.ConType = TWON_ONEVALUE;
twCap.hContainer = NULL;
USHORT ret = m_dsmImpl->m_pDSMProc(&m_dsmImpl->m_AppId, &m_iden, DG_CONTROL, DAT_CAPABILITY, MSG_GETCURRENT, &twCap);
if (TWRC_SUCCESS != ret)
if (TWRC_SUCCESS != m_dsmImpl->m_pDSMProc(&m_dsmImpl->m_AppId, &m_iden, DG_CONTROL, DAT_CAPABILITY, MSG_GETCURRENT, &twCap))
{
return HGTWAIN_ERR_FAIL;
}
HGResult ret = HGBASE_ERR_FAIL;
assert(NULL != twCap.hContainer);
pTW_ONEVALUE pVal = (pTW_ONEVALUE)GlobalLock(twCap.hContainer);
assert(NULL != pVal);
*value = pVal->Item;
CapInt32Type* pVal = (CapInt32Type*)GlobalLock(twCap.hContainer);
if (NULL != pVal && pVal->ItemType == TWTY_INT32)
{
*value = pVal->Value;
ret = HGBASE_ERR_OK;
}
GlobalUnlock(twCap.hContainer);
GlobalFree(twCap.hContainer);
return HGBASE_ERR_OK;
return ret;
}
HGResult HGTwainDSImpl::GetCap(HGUInt cap, HGChar *value, HGUInt maxLen)
struct CapStr255Type
{
TW_UINT16 ItemType;
TW_STR255 Value;
};
HGResult HGTwainDSImpl::SetCapStr255(HGUInt cap, const HGChar *value)
{
if (NULL == value || strlen(value) >= sizeof(TWTY_STR255))
{
return HGBASE_ERR_INVALIDARG;
}
TW_CAPABILITY twCap;
twCap.Cap = (TW_UINT16)cap;
twCap.ConType = TWON_ONEVALUE;
twCap.hContainer = GlobalAlloc(GHND, sizeof(CapStr255Type));
if (NULL == twCap.hContainer)
{
return HGBASE_ERR_FAIL;
}
CapStr255Type* pVal = (CapStr255Type*)GlobalLock(twCap.hContainer);
assert(NULL != pVal);
pVal->ItemType = TWTY_STR255;
strcpy(pVal->Value, value);
GlobalUnlock(twCap.hContainer);
USHORT ret = m_dsmImpl->m_pDSMProc(&m_dsmImpl->m_AppId, &m_iden, DG_CONTROL, DAT_CAPABILITY, MSG_SET, &twCap);
GlobalFree(twCap.hContainer);
return (TWRC_SUCCESS == ret) ? HGBASE_ERR_OK : HGTWAIN_ERR_FAIL;
}
HGResult HGTwainDSImpl::ResetCapStr255(HGUInt cap)
{
TW_CAPABILITY twCap;
twCap.Cap = (TW_UINT16)cap;
twCap.ConType = TWON_ONEVALUE;
twCap.hContainer = GlobalAlloc(GHND, sizeof(CapStr255Type));
if (NULL == twCap.hContainer)
{
return HGBASE_ERR_FAIL;
}
CapStr255Type* pVal = (CapStr255Type*)GlobalLock(twCap.hContainer);
assert(NULL != pVal);
pVal->ItemType = TWTY_STR255;
memset(pVal->Value, 0, sizeof(pVal->Value));
GlobalUnlock(twCap.hContainer);
USHORT ret = m_dsmImpl->m_pDSMProc(&m_dsmImpl->m_AppId, &m_iden, DG_CONTROL, DAT_CAPABILITY, MSG_RESET, &twCap);
GlobalFree(twCap.hContainer);
return (TWRC_SUCCESS == ret) ? HGBASE_ERR_OK : HGTWAIN_ERR_FAIL;
}
HGResult HGTwainDSImpl::GetCapStr255(HGUInt cap, HGChar *value, HGUInt maxLen)
{
if (NULL == value || 0 == maxLen)
{
@ -595,21 +766,25 @@ HGResult HGTwainDSImpl::GetCap(HGUInt cap, HGChar *value, HGUInt maxLen)
twCap.Cap = (TW_UINT16)cap;
twCap.ConType = TWON_ONEVALUE;
twCap.hContainer = NULL;
USHORT rc = m_dsmImpl->m_pDSMProc(&m_dsmImpl->m_AppId, &m_iden, DG_CONTROL, DAT_CAPABILITY, MSG_GETCURRENT, &twCap);
if (TWRC_SUCCESS != rc)
if (TWRC_SUCCESS != m_dsmImpl->m_pDSMProc(&m_dsmImpl->m_AppId, &m_iden, DG_CONTROL, DAT_CAPABILITY, MSG_GETCURRENT, &twCap))
{
return HGTWAIN_ERR_FAIL;
}
HGResult ret = HGBASE_ERR_INVALIDARG;
HGResult ret = HGBASE_ERR_FAIL;
assert(NULL != twCap.hContainer);
pTW_ONEVALUE pVal = (pTW_ONEVALUE)GlobalLock(twCap.hContainer);
assert(NULL != pVal);
if (maxLen > strlen((char *)&pVal->Item))
CapStr255Type* pVal = (CapStr255Type*)GlobalLock(twCap.hContainer);
if (NULL != pVal && pVal->ItemType == TWTY_STR255)
{
strcpy(value, (char *)&pVal->Item);
ret = HGBASE_ERR_OK;
if (maxLen > strlen(pVal->Value))
{
strcpy(value, pVal->Value);
ret = HGBASE_ERR_OK;
}
else
{
ret = HGBASE_ERR_INVALIDARG;
}
}
GlobalUnlock(twCap.hContainer);

View File

@ -52,7 +52,16 @@ public:
HGResult Close();
HGResult GetName(HGChar* name, HGUInt maxLen);
HGResult GetDeviceName(HGChar* name, HGUInt maxLen);
HGResult GetDeviceCustomInfo(HGTwainDeviceCustomInfo *info);
HGResult Login(const HGChar *user, const HGChar *pwd);
HGResult Logout();
HGResult ClearRollerCount();
HGResult GetDriverLogPath(HGChar *path, HGUInt maxLen);
HGResult ClearDriverLog();
HGResult GetDeviceLogPath(HGChar *path, HGUInt maxLen);
HGResult ClearDeviceLog();
HGResult EnableUIOnly(HWND parent, HGDSCloseReqFunc eventFunc, HGPointer eventParam);
HGResult Enable(HGBool showUI, HWND parent, HGDSCloseReqFunc eventFunc, HGPointer eventParam,
HGDSImageFunc imageFunc, HGPointer imageParam);
@ -61,9 +70,12 @@ public:
HGResult Disable();
private:
HGResult SetCap(HGUInt cap, HGInt value);
HGResult GetCap(HGUInt cap, HGInt* value);
HGResult GetCap(HGUInt cap, HGChar *value, HGUInt maxLen);
HGResult SetCapInt32(HGUInt cap, HGInt value);
HGResult ResetCapInt32(HGUInt cap);
HGResult GetCapInt32(HGUInt cap, HGInt* value);
HGResult SetCapStr255(HGUInt cap, const HGChar *value);
HGResult ResetCapStr255(HGUInt cap);
HGResult GetCapStr255(HGUInt cap, HGChar *value, HGUInt maxLen);
HGResult ImageNativeXfer(HGUInt type, HGUInt origin, HGImage* image);
HGResult EndXfer(HGUInt* count);
HGResult Reset();