将twain_user接口和sane_user接口统一成一种风格

This commit is contained in:
luoliangyi 2023-03-27 11:17:11 +08:00
parent 42d3ef90ee
commit f1a4f34f5a
9 changed files with 389 additions and 664 deletions

View File

@ -129,8 +129,7 @@ BOOL CHGTestDlg::OnInitDialog()
#ifdef USE_SANE #ifdef USE_SANE
HGSane_CreateManager("sane.dll", &m_saneMgr); HGSane_CreateManager("sane.dll", &m_saneMgr);
#else #else
HGTwain_LoadDSM(&m_dsm); HGTwain_CreateDSM(m_hWnd, &m_dsm);
HGTwain_OpenDSM(m_dsm, m_hWnd);
#endif #endif
return TRUE; // 除非将焦点设置到控件,否则返回 TRUE return TRUE; // 除非将焦点设置到控件,否则返回 TRUE
@ -207,11 +206,12 @@ void CHGTestDlg::OnBnClickedButton1()
return; return;
} }
HGTwain_SelectDS(m_dsm, &m_ds); HGTwain_OpenSelectedDS(m_dsm, &m_ds);
if (NULL != m_ds) HGResult ret = HGTwain_EnableDS(m_ds, HGTRUE, m_hWnd, DSEventCallback, this, DSImageCallback, this);
if (HGBASE_ERR_OK != ret)
{ {
HGTwain_OpenDS(m_ds); HGTwain_CloseDS(m_ds);
HGTwain_EnableDS(m_ds, HGTRUE, m_hWnd, DSEventCallback, this); m_ds = NULL;
} }
#endif #endif
} }
@ -237,50 +237,25 @@ void HGAPI CHGTestDlg::DeviceEventCallback(HGSaneDevice dev, HGUInt error, const
void HGAPI CHGTestDlg::DeviceImageCallback(HGSaneDevice dev, HGImage image, HGPointer param) void HGAPI CHGTestDlg::DeviceImageCallback(HGSaneDevice dev, HGImage image, HGPointer param)
{ {
CHGTestDlg* p = (CHGTestDlg*)param; CHGTestDlg* p = (CHGTestDlg*)param;
CStringA strName; CStringA strName;
strName.Format("D:\\HGTest_%u.jpg", p->m_idx++); strName.Format("D:\\HGTest_%u.jpg", p->m_idx++);
HGImgFmt_SaveImage(image, 0, NULL, strName); HGImgFmt_SaveImage(image, 0, NULL, strName);
} }
#else #else
void CHGTestDlg::DSEventCallback(HGTwainDS ds, HGUInt event, HGPointer param) void CHGTestDlg::DSEventCallback(HGTwainDS ds, HGUInt error, const HGChar* errInfo, HGPointer param)
{ {
CHGTestDlg* p = (CHGTestDlg*)param; CHGTestDlg* p = (CHGTestDlg*)param;
if (HGTWAIN_DSEVENT_XFERREADY == event) ::PostMessage(p->m_hWnd, 2000, 0, 0);
{ }
while (1) void HGAPI CHGTestDlg::DSImageCallback(HGTwainDS ds, HGImage image, HGPointer param)
{ {
HGImage image = NULL; CHGTestDlg* p = (CHGTestDlg*)param;
HGTwain_ImageNativeXfer(p->m_ds, 0, 0, &image); CStringA strName;
CStringA strName; strName.Format("D:\\HGTest_%u.jpg", p->m_idx++);
strName.Format("D:\\Twain_%u.jpg", p->m_idx++); HGImgFmt_SaveImage(image, 0, NULL, strName);
HGImgFmt_SaveImage(image, 0, NULL, strName);
HGBase_DestroyImage(image);
HGUInt count = 0;
HGTwain_EndXfer(p->m_ds, &count);
if (0 == count)
{
break;
}
}
HGTwain_Reset(p->m_ds);
}
else if (HGTWAIN_DSEVENT_CLOSEDSREQ == event)
{
HGTwain_CloseDS(p->m_ds);
p->m_ds = NULL;
}
else if (HGTWAIN_DSEVENT_CLOSEDSOK == event)
{
HGTwain_CloseDS(p->m_ds);
p->m_ds = NULL;
}
} }
#endif #endif
LRESULT CHGTestDlg::WindowProc(UINT message, WPARAM wParam, LPARAM lParam) LRESULT CHGTestDlg::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{ {
if (2000 == message) if (2000 == message)
@ -288,6 +263,9 @@ LRESULT CHGTestDlg::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
#ifdef USE_SANE #ifdef USE_SANE
HGSane_CloseDevice(m_saneDev); HGSane_CloseDevice(m_saneDev);
m_saneDev = NULL; m_saneDev = NULL;
#else
HGTwain_CloseDS(m_ds);
m_ds = NULL;
#endif #endif
} }

View File

@ -30,7 +30,8 @@ protected:
#else #else
HGTwainDSM m_dsm; HGTwainDSM m_dsm;
HGTwainDS m_ds; HGTwainDS m_ds;
static void HGAPI DSEventCallback(HGTwainDS ds, HGUInt event, HGPointer param); static void HGAPI DSEventCallback(HGTwainDS ds, HGUInt error, const HGChar* errInfo, HGPointer param);
static void HGAPI DSImageCallback(HGTwainDS ds, HGImage image, HGPointer param);
#endif #endif
// 实现 // 实现

View File

@ -2,21 +2,14 @@ LIBRARY
EXPORTS EXPORTS
HGTwain_LoadDSM HGTwain_CreateDSM
HGTwain_UnloadDSM HGTwain_DestroyDSM
HGTwain_OpenDSM HGTwain_GetDSCount
HGTwain_CloseDSM
HGTwain_GetDSList
HGTwain_GetDefaultDS
HGTwain_SelectDS
HGTwain_GetDSName HGTwain_GetDSName
HGTwain_OpenDS HGTwain_OpenDS
HGTwain_OpenDefaultDS
HGTwain_OpenSelectedDS
HGTwain_CloseDS HGTwain_CloseDS
HGTwain_SetCapability
HGTwain_GetCapability
HGTwain_EnableDSUIOnly HGTwain_EnableDSUIOnly
HGTwain_EnableDS HGTwain_EnableDS
HGTwain_DisableDS HGTwain_DisableDS
HGTwain_ImageNativeXfer
HGTwain_EndXfer
HGTwain_Reset

View File

@ -10,7 +10,7 @@
HG_DECLARE_HANDLE(HGSaneManager); HG_DECLARE_HANDLE(HGSaneManager);
HG_DECLARE_HANDLE(HGSaneDevice); HG_DECLARE_HANDLE(HGSaneDevice);
/* Sane设备回调 /* Sane回调
*/ */
typedef void (HGAPI* HGSane_DeviceEventFunc)(HGSaneDevice dev, HGUInt error, const HGChar *errInfo, HGPointer param); typedef void (HGAPI* HGSane_DeviceEventFunc)(HGSaneDevice dev, HGUInt error, const HGChar *errInfo, HGPointer param);
typedef void (HGAPI* HGSane_DeviceImageFunc)(HGSaneDevice dev, HGImage image, HGPointer param); typedef void (HGAPI* HGSane_DeviceImageFunc)(HGSaneDevice dev, HGImage image, HGPointer param);

View File

@ -26,10 +26,7 @@ HGSaneManagerImpl::~HGSaneManagerImpl()
HGResult HGSaneManagerImpl::Create(const HGChar* sanePath) HGResult HGSaneManagerImpl::Create(const HGChar* sanePath)
{ {
if (NULL != m_dll) assert(NULL == m_dll);
{
return HGBASE_ERR_FAIL;
}
HGResult ret = HGBase_CreateDll(sanePath, &m_dll); HGResult ret = HGBase_CreateDll(sanePath, &m_dll);
if (HGBASE_ERR_OK != ret) if (HGBASE_ERR_OK != ret)
@ -57,18 +54,16 @@ HGResult HGSaneManagerImpl::Create(const HGChar* sanePath)
HGResult HGSaneManagerImpl::Destroy() HGResult HGSaneManagerImpl::Destroy()
{ {
assert(NULL != m_dll);
if (!m_listDeviceImpl.empty()) if (!m_listDeviceImpl.empty())
{ {
return HGBASE_ERR_FAIL; return HGBASE_ERR_FAIL;
} }
if (NULL != m_dll) m_f_sane_exit();
{ HGBase_DestroyDll(m_dll);
m_f_sane_exit(); m_dll = NULL;
HGBase_DestroyDll(m_dll);
m_dll = NULL;
}
return HGBASE_ERR_OK; return HGBASE_ERR_OK;
} }
@ -256,10 +251,7 @@ HGSaneDeviceImpl::~HGSaneDeviceImpl()
HGResult HGSaneDeviceImpl::Open(const HGChar* devName, HGChar* errInfo, HGUInt errInfoLen) HGResult HGSaneDeviceImpl::Open(const HGChar* devName, HGChar* errInfo, HGUInt errInfoLen)
{ {
if (NULL != m_devHandle) assert(NULL == m_devHandle);
{
return HGBASE_ERR_FAIL;
}
if (NULL == devName) if (NULL == devName)
{ {
@ -289,10 +281,7 @@ HGResult HGSaneDeviceImpl::Open(const HGChar* devName, HGChar* errInfo, HGUInt e
HGResult HGSaneDeviceImpl::Close() HGResult HGSaneDeviceImpl::Close()
{ {
if (NULL == m_devHandle) assert(NULL != m_devHandle);
{
return HGBASE_ERR_FAIL;
}
Stop(); Stop();
m_mgrImpl->m_f_sane_close(m_devHandle); m_mgrImpl->m_f_sane_close(m_devHandle);

View File

@ -1,7 +1,7 @@
#include "HGTwain.h" #include "HGTwain.h"
#include "HGTwainImpl.hpp" #include "HGTwainImpl.hpp"
HGResult HGAPI HGTwain_LoadDSM(HGTwainDSM* dsm) HGResult HGAPI HGTwain_CreateDSM(HWND hwnd, HGTwainDSM* dsm)
{ {
if (NULL == dsm) if (NULL == dsm)
{ {
@ -9,7 +9,7 @@ HGResult HGAPI HGTwain_LoadDSM(HGTwainDSM* dsm)
} }
HGTwainDSMImpl* twainDSMImpl = new HGTwainDSMImpl; HGTwainDSMImpl* twainDSMImpl = new HGTwainDSMImpl;
HGResult ret = twainDSMImpl->LoadDSM(); HGResult ret = twainDSMImpl->Create(hwnd);
if (HGBASE_ERR_OK != ret) if (HGBASE_ERR_OK != ret)
{ {
delete twainDSMImpl; delete twainDSMImpl;
@ -20,7 +20,7 @@ HGResult HGAPI HGTwain_LoadDSM(HGTwainDSM* dsm)
return HGBASE_ERR_OK; return HGBASE_ERR_OK;
} }
HGResult HGAPI HGTwain_UnloadDSM(HGTwainDSM dsm) HGResult HGAPI HGTwain_DestroyDSM(HGTwainDSM dsm)
{ {
if (NULL == dsm) if (NULL == dsm)
{ {
@ -28,7 +28,7 @@ HGResult HGAPI HGTwain_UnloadDSM(HGTwainDSM dsm)
} }
HGTwainDSMImpl* twainDSMImpl = (HGTwainDSMImpl*)dsm; HGTwainDSMImpl* twainDSMImpl = (HGTwainDSMImpl*)dsm;
HGResult ret = twainDSMImpl->UnloadDSM(); HGResult ret = twainDSMImpl->Destroy();
if (HGBASE_ERR_OK != ret) if (HGBASE_ERR_OK != ret)
{ {
return ret; return ret;
@ -38,7 +38,7 @@ HGResult HGAPI HGTwain_UnloadDSM(HGTwainDSM dsm)
return HGBASE_ERR_OK; return HGBASE_ERR_OK;
} }
HGResult HGAPI HGTwain_OpenDSM(HGTwainDSM dsm, HWND hwnd) HGResult HGAPI HGTwain_GetDSCount(HGTwainDSM dsm, HGUInt* count)
{ {
if (NULL == dsm) if (NULL == dsm)
{ {
@ -46,10 +46,10 @@ HGResult HGAPI HGTwain_OpenDSM(HGTwainDSM dsm, HWND hwnd)
} }
HGTwainDSMImpl* twainDSMImpl = (HGTwainDSMImpl*)dsm; HGTwainDSMImpl* twainDSMImpl = (HGTwainDSMImpl*)dsm;
return twainDSMImpl->OpenDSM(hwnd); return twainDSMImpl->GetDSCount(count);
} }
HGResult HGAPI HGTwain_CloseDSM(HGTwainDSM dsm) HGResult HGAPI HGTwain_GetDSName(HGTwainDSM dsm, HGUInt index, HGChar* name, HGUInt maxLen)
{ {
if (NULL == dsm) if (NULL == dsm)
{ {
@ -57,10 +57,10 @@ HGResult HGAPI HGTwain_CloseDSM(HGTwainDSM dsm)
} }
HGTwainDSMImpl* twainDSMImpl = (HGTwainDSMImpl*)dsm; HGTwainDSMImpl* twainDSMImpl = (HGTwainDSMImpl*)dsm;
return twainDSMImpl->CloseDSM(); return twainDSMImpl->GetDSName(index, name, maxLen);
} }
HGResult HGAPI HGTwain_GetDSList(HGTwainDSM dsm, HGTwainDS* ds, HGUInt* size) HGResult HGAPI HGTwain_OpenDS(HGTwainDSM dsm, HGUInt index, HGTwainDS* ds)
{ {
if (NULL == dsm) if (NULL == dsm)
{ {
@ -68,10 +68,18 @@ HGResult HGAPI HGTwain_GetDSList(HGTwainDSM dsm, HGTwainDS* ds, HGUInt* size)
} }
HGTwainDSMImpl* twainDSMImpl = (HGTwainDSMImpl*)dsm; HGTwainDSMImpl* twainDSMImpl = (HGTwainDSMImpl*)dsm;
return twainDSMImpl->GetDSList((HGTwainDSImpl**)ds, size); class HGTwainDSImpl* dsImpl = NULL;
HGResult ret = twainDSMImpl->OpenDS(index, &dsImpl);
if (HGBASE_ERR_OK != ret)
{
return ret;
}
*ds = (HGTwainDS)dsImpl;
return HGBASE_ERR_OK;
} }
HGResult HGAPI HGTwain_GetDefaultDS(HGTwainDSM dsm, HGTwainDS* ds) HGResult HGAPI HGTwain_OpenDefaultDS(HGTwainDSM dsm, HGTwainDS* ds)
{ {
if (NULL == dsm) if (NULL == dsm)
{ {
@ -79,10 +87,18 @@ HGResult HGAPI HGTwain_GetDefaultDS(HGTwainDSM dsm, HGTwainDS* ds)
} }
HGTwainDSMImpl* twainDSMImpl = (HGTwainDSMImpl*)dsm; HGTwainDSMImpl* twainDSMImpl = (HGTwainDSMImpl*)dsm;
return twainDSMImpl->GetDefaultDS((HGTwainDSImpl**)ds); class HGTwainDSImpl* dsImpl = NULL;
HGResult ret = twainDSMImpl->OpenDefaultDS(&dsImpl);
if (HGBASE_ERR_OK != ret)
{
return ret;
}
*ds = (HGTwainDS)dsImpl;
return HGBASE_ERR_OK;
} }
HGResult HGAPI HGTwain_SelectDS(HGTwainDSM dsm, HGTwainDS* ds) HGResult HGAPI HGTwain_OpenSelectedDS(HGTwainDSM dsm, HGTwainDS* ds)
{ {
if (NULL == dsm) if (NULL == dsm)
{ {
@ -90,29 +106,15 @@ HGResult HGAPI HGTwain_SelectDS(HGTwainDSM dsm, HGTwainDS* ds)
} }
HGTwainDSMImpl* twainDSMImpl = (HGTwainDSMImpl*)dsm; HGTwainDSMImpl* twainDSMImpl = (HGTwainDSMImpl*)dsm;
return twainDSMImpl->SelectDS((HGTwainDSImpl**)ds); class HGTwainDSImpl* dsImpl = NULL;
} HGResult ret = twainDSMImpl->OpenSelectedDS(&dsImpl);
if (HGBASE_ERR_OK != ret)
HGResult HGAPI HGTwain_GetDSName(HGTwainDS ds, HGChar* name, HGUInt maxLen)
{
if (NULL == ds)
{ {
return HGBASE_ERR_INVALIDARG; return ret;
} }
HGTwainDSImpl* twainDSImpl = (HGTwainDSImpl*)ds; *ds = (HGTwainDS)dsImpl;
return twainDSImpl->GetName(name, maxLen); return HGBASE_ERR_OK;
}
HGResult HGAPI HGTwain_OpenDS(HGTwainDS ds)
{
if (NULL == ds)
{
return HGBASE_ERR_INVALIDARG;
}
HGTwainDSImpl* twainDSImpl = (HGTwainDSImpl*)ds;
return twainDSImpl->Open();
} }
HGResult HGAPI HGTwain_CloseDS(HGTwainDS ds) HGResult HGAPI HGTwain_CloseDS(HGTwainDS ds)
@ -126,7 +128,7 @@ HGResult HGAPI HGTwain_CloseDS(HGTwainDS ds)
return twainDSImpl->Close(); return twainDSImpl->Close();
} }
HGResult HGAPI HGTwain_SetCapability(HGTwainDS ds, HGUInt cap, HGInt value) HGResult HGAPI HGTwain_EnableDSUIOnly(HGTwainDS ds, HGBool showUI, HWND parent, HGDSEventFunc eventFunc, HGPointer eventParam)
{ {
if (NULL == ds) if (NULL == ds)
{ {
@ -134,10 +136,11 @@ HGResult HGAPI HGTwain_SetCapability(HGTwainDS ds, HGUInt cap, HGInt value)
} }
HGTwainDSImpl* twainDSImpl = (HGTwainDSImpl*)ds; HGTwainDSImpl* twainDSImpl = (HGTwainDSImpl*)ds;
return twainDSImpl->SetCap(cap, value); return twainDSImpl->EnableUIOnly(showUI, parent, eventFunc, eventParam);
} }
HGResult HGAPI HGTwain_GetCapability(HGTwainDS ds, HGUInt cap, HGInt* value) HGResult HGAPI HGTwain_EnableDS(HGTwainDS ds, HGBool showUI, HWND parent, HGDSEventFunc eventFunc, HGPointer eventParam,
HGDSImageFunc imageFunc, HGPointer imageParam)
{ {
if (NULL == ds) if (NULL == ds)
{ {
@ -145,29 +148,7 @@ HGResult HGAPI HGTwain_GetCapability(HGTwainDS ds, HGUInt cap, HGInt* value)
} }
HGTwainDSImpl* twainDSImpl = (HGTwainDSImpl*)ds; HGTwainDSImpl* twainDSImpl = (HGTwainDSImpl*)ds;
return twainDSImpl->GetCap(cap, value); return twainDSImpl->Enable(showUI, parent, eventFunc, eventParam, imageFunc, imageParam);
}
HGResult HGAPI HGTwain_EnableDSUIOnly(HGTwainDS ds, HGBool showUI, HWND parent, HGDSEventFunc func, HGPointer param)
{
if (NULL == ds)
{
return HGBASE_ERR_INVALIDARG;
}
HGTwainDSImpl* twainDSImpl = (HGTwainDSImpl*)ds;
return twainDSImpl->EnableUIOnly(showUI, parent, func, param);
}
HGResult HGAPI HGTwain_EnableDS(HGTwainDS ds, HGBool showUI, HWND parent, HGDSEventFunc func, HGPointer param)
{
if (NULL == ds)
{
return HGBASE_ERR_INVALIDARG;
}
HGTwainDSImpl* twainDSImpl = (HGTwainDSImpl*)ds;
return twainDSImpl->Enable(showUI, parent, func, param);
} }
HGResult HGAPI HGTwain_DisableDS(HGTwainDS ds) HGResult HGAPI HGTwain_DisableDS(HGTwainDS ds)
@ -179,37 +160,4 @@ HGResult HGAPI HGTwain_DisableDS(HGTwainDS ds)
HGTwainDSImpl* twainDSImpl = (HGTwainDSImpl*)ds; HGTwainDSImpl* twainDSImpl = (HGTwainDSImpl*)ds;
return twainDSImpl->Disable(); return twainDSImpl->Disable();
}
HGResult HGAPI HGTwain_ImageNativeXfer(HGTwainDS ds, HGUInt type, HGUInt origin, HGImage* image)
{
if (NULL == ds)
{
return HGBASE_ERR_INVALIDARG;
}
HGTwainDSImpl* twainDSImpl = (HGTwainDSImpl*)ds;
return twainDSImpl->ImageNativeXfer(type, origin, image);
}
HGResult HGAPI HGTwain_EndXfer(HGTwainDS ds, HGUInt* count)
{
if (NULL == ds)
{
return HGBASE_ERR_INVALIDARG;
}
HGTwainDSImpl* twainDSImpl = (HGTwainDSImpl*)ds;
return twainDSImpl->EndXfer(count);
}
HGResult HGAPI HGTwain_Reset(HGTwainDS ds)
{
if (NULL == ds)
{
return HGBASE_ERR_INVALIDARG;
}
HGTwainDSImpl* twainDSImpl = (HGTwainDSImpl*)ds;
return twainDSImpl->Reset();
} }

View File

@ -9,199 +9,32 @@
HG_DECLARE_HANDLE(HGTwainDSM); HG_DECLARE_HANDLE(HGTwainDSM);
HG_DECLARE_HANDLE(HGTwainDS); HG_DECLARE_HANDLE(HGTwainDS);
/* 能力 */ /* ds回调
#define HGTWAIN_DSCAP_DUPLEX 1L
#define HGTWAIN_DSCAP_DUPLEXENABLED 2L
#define HGTWAIN_DSCAP_XFERCOUNT 3L
/* 未知事件, 可能是该库未进行处理的事件 */
#define HGTWAIN_DSEVENT_UNKNOWN 0L
#define HGTWAIN_DSEVENT_XFERREADY 1L
#define HGTWAIN_DSEVENT_CLOSEDSREQ 2L
#define HGTWAIN_DSEVENT_CLOSEDSOK 3L
/* twain事件回调
* :
* 1) ds: in, DS句柄
* 2) event: in, , HGTWAIN_DSEVENT_*
* 3) param: in,
* :
* 1) event为HGTWAIN_EVENT_XFERREADY, TWAIN状态从5变为6
* 2) event为HGTWAIN_EVENT_CLOSEDSREQ, DS
*/ */
typedef void (HGAPI *HGDSEventFunc)(HGTwainDS ds, HGUInt event, HGPointer param); typedef void (HGAPI *HGDSEventFunc)(HGTwainDS ds, HGUInt error, const HGChar* errInfo, HGPointer param);
typedef void (HGAPI* HGDSImageFunc)(HGTwainDS ds, HGImage image, HGPointer param);
/* 加载DSM HGEXPORT HGResult HGAPI HGTwain_CreateDSM(HWND hwnd, HGTwainDSM *dsm);
* :
* 1) dsm: out, DSM句柄
* :
* 1) TWAIN状态从1变为2
*/
HGEXPORT HGResult HGAPI HGTwain_LoadDSM(HGTwainDSM *dsm);
/* 卸载DSM HGEXPORT HGResult HGAPI HGTwain_DestroyDSM(HGTwainDSM dsm);
* :
* 1) dsm: in, DSM句柄
* :
* 1) TWAIN状态从2变为1
*/
HGEXPORT HGResult HGAPI HGTwain_UnloadDSM(HGTwainDSM dsm);
/* 打开DSM HGEXPORT HGResult HGAPI HGTwain_GetDSCount(HGTwainDSM dsm, HGUInt* count);
* :
* 1) dsm: in, DSM句柄
* :
* 1) TWAIN状态从2变为3
* 2) 线
*/
HGEXPORT HGResult HGAPI HGTwain_OpenDSM(HGTwainDSM dsm, HWND hwnd);
/* 关闭DSM HGEXPORT HGResult HGAPI HGTwain_GetDSName(HGTwainDSM dsm, HGUInt index, HGChar* name, HGUInt maxLen);
* :
* 1) dsm: in, DSM句柄
* :
* 1) TWAIN状态从3变为2
*/
HGEXPORT HGResult HGAPI HGTwain_CloseDSM(HGTwainDSM dsm);
/* 获取DS列表 HGEXPORT HGResult HGAPI HGTwain_OpenDS(HGTwainDSM dsm, HGUInt index, HGTwainDS *ds);
* :
* 1) dsm: in, DSM句柄
* 2) ds: out, DS句柄列表
* 3) size: in, out, DS句柄列表大小/DS句柄数量
* :
* 1) TWAIN状态为3
* 2) size既作为输入,
*/
HGEXPORT HGResult HGAPI HGTwain_GetDSList(HGTwainDSM dsm, HGTwainDS *ds, HGUInt *size);
/* 获取默认的DS HGEXPORT HGResult HGAPI HGTwain_OpenDefaultDS(HGTwainDSM dsm, HGTwainDS* ds);
* :
* 1) dsm: in, DSM句柄
* 2) ds: out, DS句柄
* :
* 1) TWAIN状态为3
*/
HGEXPORT HGResult HGAPI HGTwain_GetDefaultDS(HGTwainDSM dsm, HGTwainDS* ds);
/* 弹出DS选择框并返回选择的DS HGEXPORT HGResult HGAPI HGTwain_OpenSelectedDS(HGTwainDSM dsm, HGTwainDS* ds);
* :
* 1) dsm: in, DSM句柄
* 2) ds: out, DS句柄
* :
* 1) TWAIN状态为3
*/
HGEXPORT HGResult HGAPI HGTwain_SelectDS(HGTwainDSM dsm, HGTwainDS* ds);
/* 获取DS名称
* :
* 1) ds: in, DS句柄
* 2) name: out, DS名字数据区地址
* 3) maxLen: in, DS名字数据区长度
* :
* 1) TWAIN状态为3
* 2) size既作为输入, , size包括空字符
*/
HGEXPORT HGResult HGAPI HGTwain_GetDSName(HGTwainDS ds, HGChar *name, HGUInt maxLen);
/* 打开DS
* :
* 1) ds: in, DS句柄
* :
* 1) TWAIN状态从3变为4
*/
HGEXPORT HGResult HGAPI HGTwain_OpenDS(HGTwainDS ds);
/* 关闭DS
* :
* 1) ds: in, DS句柄
* :
* 1) TWAIN状态从4变为3
*/
HGEXPORT HGResult HGAPI HGTwain_CloseDS(HGTwainDS ds); HGEXPORT HGResult HGAPI HGTwain_CloseDS(HGTwainDS ds);
/* 设置DS的能力 HGEXPORT HGResult HGAPI HGTwain_EnableDSUIOnly(HGTwainDS ds, HGBool showUI, HWND parent, HGDSEventFunc eventFunc, HGPointer eventParam);
* :
* 1) ds: in, DS句柄
* 2) cap: in,
* 3) value: in,
* :
* 1) TWAIN状态为4
*/
HGEXPORT HGResult HGAPI HGTwain_SetCapability(HGTwainDS ds, HGUInt cap, HGInt value);
/* 获取DS的能力 HGEXPORT HGResult HGAPI HGTwain_EnableDS(HGTwainDS ds, HGBool showUI, HWND parent, HGDSEventFunc eventFunc, HGPointer eventParam,
* : HGDSImageFunc imageFunc, HGPointer imageParam);
* 1) ds: in, DS句柄
* 2) cap: in,
* 3) value: out,
* :
* 1) TWAIN状态为4-7
*/
HGEXPORT HGResult HGAPI HGTwain_GetCapability(HGTwainDS ds, HGUInt cap, HGInt* value);
/* 启动DS, 仅仅用作参数设置
* :
* 1) ds: in, DS句柄
* 2) showUI: in, UI
* 3) parent: in,
* 4) func: in,
* 5) param: in,
* :
* 1) TWAIN状态从4变为5
*/
HGEXPORT HGResult HGAPI HGTwain_EnableDSUIOnly(HGTwainDS ds, HGBool showUI, HWND parent, HGDSEventFunc func, HGPointer param);
/* 启动DS
* :
* 1) ds: in, DS句柄
* 2) showUI: in, UI
* 3) parent: in,
* 4) func: in,
* 5) param: in,
* :
* 1) TWAIN状态从4变为5
*/
HGEXPORT HGResult HGAPI HGTwain_EnableDS(HGTwainDS ds, HGBool showUI, HWND parent, HGDSEventFunc func, HGPointer param);
/* 停止DS
* :
* 1) ds: in, DS句柄
* :
* 1) TWAIN状态从5变为4
*/
HGEXPORT HGResult HGAPI HGTwain_DisableDS(HGTwainDS ds); HGEXPORT HGResult HGAPI HGTwain_DisableDS(HGTwainDS ds);
/* 本地传输图像
* :
* 1) ds: in, DS句柄
* 2) type: in,
* 3) origin: in,
* 4) image: out,
* :
* 1) 6
* 2) TWAIN状态从6变为7
* 3) image需要调用HGBase_DestroyImage销毁
*/
HGEXPORT HGResult HGAPI HGTwain_ImageNativeXfer(HGTwainDS ds, HGUInt type, HGUInt origin, HGImage *image);
/* 停止本次传输
* :
* 1) ds: in, DS句柄
* 2) count: out,
* :
* 1) TWAIN状态变为6
* 2) count为0时, DS
*/
HGEXPORT HGResult HGAPI HGTwain_EndXfer(HGTwainDS ds, HGUInt* count);
/* 停止所有传输
* :
* 1) ds: in, DS句柄
* :
* 1) TWAIN状态变为5
* 2) DS
*/
HGEXPORT HGResult HGAPI HGTwain_Reset(HGTwainDS ds);
#endif /* __HGTWAIN_H__ */ #endif /* __HGTWAIN_H__ */

View File

@ -8,22 +8,36 @@ HGTwainDSMImpl::HGTwainDSMImpl()
{ {
m_hDll = NULL; m_hDll = NULL;
m_pDSMProc = NULL; m_pDSMProc = NULL;
GetIdentity();
m_AppId.Id = 0; // Initialize to 0 (Source Manager will assign real value)
m_AppId.Version.MajorNum = 3; //Your app's version number
m_AppId.Version.MinorNum = 8;
m_AppId.Version.Language = TWLG_USA;
m_AppId.Version.Country = TWCY_USA;
strcpy(m_AppId.Version.Info, "3.8");
m_AppId.ProtocolMajor = TWON_PROTOCOLMAJOR;
m_AppId.ProtocolMinor = TWON_PROTOCOLMINOR;
m_AppId.SupportedGroups = DG_IMAGE | DG_CONTROL;
strcpy(m_AppId.Manufacturer, "MICSS");
strcpy(m_AppId.ProductFamily, "Generic");
strcpy(m_AppId.ProductName, "MyTwain");
m_hWnd = NULL; m_hWnd = NULL;
m_oldWndProc = NULL; m_oldWndProc = NULL;
m_DSMOpen = HGFALSE;
} }
HGTwainDSMImpl::~HGTwainDSMImpl() HGTwainDSMImpl::~HGTwainDSMImpl()
{ {
UnloadDSM();
} }
HGResult HGTwainDSMImpl::LoadDSM() HGResult HGTwainDSMImpl::Create(HWND hwnd)
{ {
if (NULL != m_pDSMProc) assert(NULL == m_oldWndProc);
if (NULL == hwnd)
{ {
return HGBASE_ERR_FAIL; return HGBASE_ERR_INVALIDARG;
} }
assert(NULL == m_hDll); assert(NULL == m_hDll);
@ -33,6 +47,7 @@ HGResult HGTwainDSMImpl::LoadDSM()
return HGBASE_ERR_FAIL; return HGBASE_ERR_FAIL;
} }
assert(NULL == m_pDSMProc);
HGBase_GetDllProcAddress(m_hDll, MAKEINTRESOURCEA(1), (HGPointer*)&m_pDSMProc); HGBase_GetDllProcAddress(m_hDll, MAKEINTRESOURCEA(1), (HGPointer*)&m_pDSMProc);
if (NULL == m_pDSMProc) if (NULL == m_pDSMProc)
{ {
@ -41,81 +56,30 @@ HGResult HGTwainDSMImpl::LoadDSM()
return HGBASE_ERR_FAIL; return HGBASE_ERR_FAIL;
} }
return HGBASE_ERR_OK;
}
HGResult HGTwainDSMImpl::UnloadDSM()
{
if (NULL == m_pDSMProc)
{
return HGBASE_ERR_FAIL;
}
// 先必须关闭DSM
CloseDSM();
m_pDSMProc = NULL;
HGBase_DestroyDll(m_hDll);
m_hDll = NULL;
return HGBASE_ERR_OK;
}
HGResult HGTwainDSMImpl::OpenDSM(HWND hwnd)
{
if (NULL == m_pDSMProc || m_DSMOpen)
{
return HGBASE_ERR_FAIL;
}
if (NULL == hwnd)
{
return HGBASE_ERR_INVALIDARG;
}
USHORT ret = m_pDSMProc(&m_AppId, NULL, DG_CONTROL, DAT_PARENT, MSG_OPENDSM, (TW_MEMREF)&hwnd); USHORT ret = m_pDSMProc(&m_AppId, NULL, DG_CONTROL, DAT_PARENT, MSG_OPENDSM, (TW_MEMREF)&hwnd);
if (TWRC_SUCCESS != ret) if (TWRC_SUCCESS != ret)
{ {
return HGBASE_ERR_FAIL; m_pDSMProc = NULL;
HGBase_DestroyDll(m_hDll);
m_hDll = NULL;
return HGTWAIN_ERR_FAIL;
} }
m_hWnd = hwnd; m_hWnd = hwnd;
m_mapWnd[m_hWnd] = this; m_mapWnd[m_hWnd] = this;
m_oldWndProc = (WNDPROC)SetWindowLongPtrW(m_hWnd, GWLP_WNDPROC, (LONG_PTR)NewWndProc); m_oldWndProc = (WNDPROC)SetWindowLongPtrW(m_hWnd, GWLP_WNDPROC, (LONG_PTR)NewWndProc);
m_DSMOpen = HGTRUE;
// 获取DS列表
TW_IDENTITY ds;
ret = m_pDSMProc(&m_AppId, NULL, DG_CONTROL, DAT_IDENTITY, MSG_GETFIRST, &ds);
if (TWRC_SUCCESS == ret)
{
HGTwainDSImpl* dsImpl = new HGTwainDSImpl(this, &ds);
m_vpDSImpl.push_back(dsImpl);
while (TWRC_SUCCESS == m_pDSMProc(&m_AppId, NULL, DG_CONTROL, DAT_IDENTITY, MSG_GETNEXT, &ds))
{
HGTwainDSImpl* dsImpl = new HGTwainDSImpl(this, &ds);
m_vpDSImpl.push_back(dsImpl);
}
}
return HGBASE_ERR_OK; return HGBASE_ERR_OK;
} }
HGResult HGTwainDSMImpl::CloseDSM() HGResult HGTwainDSMImpl::Destroy()
{ {
if (!m_DSMOpen) assert(NULL != m_oldWndProc);
if (!m_listDSImpl.empty())
{ {
return HGBASE_ERR_FAIL; return HGBASE_ERR_FAIL;
} }
// 先必须关闭DS
for (int i = 0; i < (int)m_vpDSImpl.size(); ++i)
{
m_vpDSImpl[i]->Close();
delete m_vpDSImpl[i];
}
m_vpDSImpl.clear();
m_pDSMProc(&m_AppId, NULL, DG_CONTROL, DAT_PARENT, MSG_CLOSEDSM, (TW_MEMREF)&m_hWnd); m_pDSMProc(&m_AppId, NULL, DG_CONTROL, DAT_PARENT, MSG_CLOSEDSM, (TW_MEMREF)&m_hWnd);
SetWindowLongPtrW(m_hWnd, GWLP_WNDPROC, (LONG_PTR)m_oldWndProc); SetWindowLongPtrW(m_hWnd, GWLP_WNDPROC, (LONG_PTR)m_oldWndProc);
m_oldWndProc = NULL; m_oldWndProc = NULL;
@ -129,117 +93,160 @@ HGResult HGTwainDSMImpl::CloseDSM()
} }
} }
m_hWnd = NULL; m_hWnd = NULL;
m_DSMOpen = HGFALSE;
m_pDSMProc = NULL;
HGBase_DestroyDll(m_hDll);
m_hDll = NULL;
return HGBASE_ERR_OK; return HGBASE_ERR_OK;
} }
HGResult HGTwainDSMImpl::GetDSList(class HGTwainDSImpl** dsImpl, HGUInt* size) HGResult HGTwainDSMImpl::GetDSCount(HGUInt* count)
{ {
if (!m_DSMOpen) if (NULL == count)
{
return HGBASE_ERR_FAIL;
}
if (NULL == dsImpl || NULL == size || 0 == *size)
{ {
return HGBASE_ERR_INVALIDARG; return HGBASE_ERR_INVALIDARG;
} }
HGUInt count = 0; HGUInt num = 0;
for (int i = 0; i < (int)m_vpDSImpl.size(); ++i) TW_IDENTITY ds;
if (TWRC_SUCCESS == m_pDSMProc(&m_AppId, NULL, DG_CONTROL, DAT_IDENTITY, MSG_GETFIRST, &ds))
{ {
dsImpl[i] = m_vpDSImpl[i]; ++num;
++count; while (TWRC_SUCCESS == m_pDSMProc(&m_AppId, NULL, DG_CONTROL, DAT_IDENTITY, MSG_GETNEXT, &ds))
if (count >= *size)
{ {
++num;
}
}
*count = num;
return HGBASE_ERR_OK;
}
HGResult HGTwainDSMImpl::GetDSName(HGUInt index, HGChar* name, HGUInt maxLen)
{
if (NULL == name || 0 == maxLen)
{
return HGBASE_ERR_INVALIDARG;
}
std::vector<TW_IDENTITY> vds;
TW_IDENTITY ds;
if (TWRC_SUCCESS == m_pDSMProc(&m_AppId, NULL, DG_CONTROL, DAT_IDENTITY, MSG_GETFIRST, &ds))
{
vds.push_back(ds);
while (TWRC_SUCCESS == m_pDSMProc(&m_AppId, NULL, DG_CONTROL, DAT_IDENTITY, MSG_GETNEXT, &ds))
{
vds.push_back(ds);
}
}
if (index >= (HGUInt)vds.size())
return HGBASE_ERR_INVALIDARG;
if (maxLen < strlen(vds[index].ProductName) + 1)
return HGBASE_ERR_FAIL;
strcpy(name, vds[index].ProductName);
return HGBASE_ERR_OK;
}
HGResult HGTwainDSMImpl::OpenDS(HGUInt index, class HGTwainDSImpl** dsImpl)
{
if (NULL == dsImpl)
{
return HGBASE_ERR_INVALIDARG;
}
std::vector<TW_IDENTITY> vds;
TW_IDENTITY ds;
if (TWRC_SUCCESS == m_pDSMProc(&m_AppId, NULL, DG_CONTROL, DAT_IDENTITY, MSG_GETFIRST, &ds))
{
vds.push_back(ds);
while (TWRC_SUCCESS == m_pDSMProc(&m_AppId, NULL, DG_CONTROL, DAT_IDENTITY, MSG_GETNEXT, &ds))
{
vds.push_back(ds);
}
}
if (index >= (HGUInt)vds.size())
return HGBASE_ERR_INVALIDARG;
class HGTwainDSImpl* newDSImpl = new HGTwainDSImpl(this);
HGResult ret = newDSImpl->Open(&vds[index]);
if (HGBASE_ERR_OK != ret)
{
delete newDSImpl;
return ret;
}
m_listDSImpl.push_back(newDSImpl);
*dsImpl = newDSImpl;
return HGBASE_ERR_OK;
}
HGResult HGTwainDSMImpl::OpenDefaultDS(class HGTwainDSImpl** dsImpl)
{
if (NULL == dsImpl)
{
return HGBASE_ERR_INVALIDARG;
}
TW_IDENTITY defDS;
if (TWRC_SUCCESS != m_pDSMProc(&m_AppId, NULL, DG_CONTROL, DAT_IDENTITY, MSG_GETDEFAULT, &defDS))
{
return HGTWAIN_ERR_FAIL;
}
class HGTwainDSImpl* newDSImpl = new HGTwainDSImpl(this);
HGResult ret = newDSImpl->Open(&defDS);
if (HGBASE_ERR_OK != ret)
{
delete newDSImpl;
return ret;
}
m_listDSImpl.push_back(newDSImpl);
*dsImpl = newDSImpl;
return HGBASE_ERR_OK;
}
HGResult HGTwainDSMImpl::OpenSelectedDS(class HGTwainDSImpl** dsImpl)
{
if (NULL == dsImpl)
{
return HGBASE_ERR_INVALIDARG;
}
TW_IDENTITY selectDS;
if (TWRC_SUCCESS != m_pDSMProc(&m_AppId, NULL, DG_CONTROL, DAT_IDENTITY, MSG_USERSELECT, &selectDS))
{
return HGTWAIN_ERR_FAIL;
}
class HGTwainDSImpl* newDSImpl = new HGTwainDSImpl(this);
HGResult ret = newDSImpl->Open(&selectDS);
if (HGBASE_ERR_OK != ret)
{
delete newDSImpl;
return ret;
}
m_listDSImpl.push_back(newDSImpl);
*dsImpl = newDSImpl;
return HGBASE_ERR_OK;
}
void HGTwainDSMImpl::RemoveDS(class HGTwainDSImpl* dsImpl)
{
std::vector<class HGTwainDSImpl*>::iterator iter;
for (iter = m_listDSImpl.begin(); iter != m_listDSImpl.end(); ++iter)
{
if (*iter == dsImpl)
{
m_listDSImpl.erase(iter);
delete dsImpl;
break; break;
} }
} }
*size = count;
return HGBASE_ERR_OK;
}
HGResult HGTwainDSMImpl::GetDefaultDS(class HGTwainDSImpl** dsImpl)
{
if (!m_DSMOpen)
{
return HGBASE_ERR_FAIL;
}
if (NULL == dsImpl)
{
return HGBASE_ERR_INVALIDARG;
}
assert(NULL != m_pDSMProc);
TW_IDENTITY defDS;
USHORT ret = m_pDSMProc(&m_AppId, NULL, DG_CONTROL, DAT_IDENTITY, MSG_GETDEFAULT, &defDS);
if (TWRC_SUCCESS != ret)
{
return HGBASE_ERR_FAIL;
}
for (int i = 0; i < (int)m_vpDSImpl.size(); ++i)
{
if (0 == memcmp(&defDS, &m_vpDSImpl[i]->m_iden, sizeof(TW_IDENTITY)))
{
*dsImpl = m_vpDSImpl[i];
return HGBASE_ERR_OK;
}
}
return HGBASE_ERR_FAIL;
}
HGResult HGTwainDSMImpl::SelectDS(class HGTwainDSImpl** dsImpl)
{
if (!m_DSMOpen)
{
return HGBASE_ERR_FAIL;
}
if (NULL == dsImpl)
{
return HGBASE_ERR_INVALIDARG;
}
assert(NULL != m_pDSMProc);
TW_IDENTITY selectDS;
USHORT ret = m_pDSMProc(&m_AppId, NULL, DG_CONTROL, DAT_IDENTITY, MSG_USERSELECT, &selectDS);
if (TWRC_SUCCESS != ret)
{
return HGBASE_ERR_FAIL;
}
for (int i = 0; i < (int)m_vpDSImpl.size(); ++i)
{
if (0 == memcmp(&selectDS, &m_vpDSImpl[i]->m_iden, sizeof(TW_IDENTITY)))
{
*dsImpl = m_vpDSImpl[i];
return HGBASE_ERR_OK;
}
}
return HGBASE_ERR_FAIL;
}
void HGTwainDSMImpl::GetIdentity()
{
m_AppId.Id = 0; // Initialize to 0 (Source Manager
// will assign real value)
m_AppId.Version.MajorNum = 3; //Your app's version number
m_AppId.Version.MinorNum = 8;
m_AppId.Version.Language = TWLG_USA;
m_AppId.Version.Country = TWCY_USA;
strcpy(m_AppId.Version.Info, "3.8");
m_AppId.ProtocolMajor = TWON_PROTOCOLMAJOR;
m_AppId.ProtocolMinor = TWON_PROTOCOLMINOR;
m_AppId.SupportedGroups = DG_IMAGE | DG_CONTROL;
strcpy(m_AppId.Manufacturer, "MICSS");
strcpy(m_AppId.ProductFamily, "Generic");
strcpy(m_AppId.ProductName, "MyTwain");
} }
LRESULT CALLBACK HGTwainDSMImpl::NewWndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) LRESULT CALLBACK HGTwainDSMImpl::NewWndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
@ -253,36 +260,45 @@ LRESULT CALLBACK HGTwainDSMImpl::NewWndProc(HWND hWnd, UINT msg, WPARAM wParam,
msg2.wParam = wParam; msg2.wParam = wParam;
msg2.lParam = lParam; msg2.lParam = lParam;
for (int i = 0; i < (int)p->m_vpDSImpl.size(); ++i) for (int i = 0; i < (int)p->m_listDSImpl.size(); ++i)
{ {
if (p->m_vpDSImpl[i]->m_enable) if (p->m_listDSImpl[i]->m_enable)
{ {
TW_EVENT twEvent; TW_EVENT twEvent;
twEvent.pEvent = (TW_MEMREF)&msg2; twEvent.pEvent = (TW_MEMREF)&msg2;
twEvent.TWMessage = MSG_NULL; twEvent.TWMessage = MSG_NULL;
USHORT ret = p->m_pDSMProc(&p->m_AppId, &p->m_vpDSImpl[i]->m_iden, DG_CONTROL, DAT_EVENT, USHORT ret = p->m_pDSMProc(&p->m_AppId, &p->m_listDSImpl[i]->m_iden, DG_CONTROL, DAT_EVENT,
MSG_PROCESSEVENT, (TW_MEMREF)&twEvent); MSG_PROCESSEVENT, (TW_MEMREF)&twEvent);
if (TWRC_DSEVENT == ret) if (TWRC_DSEVENT == ret)
{ {
HGUInt event = HGTWAIN_DSEVENT_UNKNOWN;
if (MSG_XFERREADY == twEvent.TWMessage) if (MSG_XFERREADY == twEvent.TWMessage)
{ {
HGBase_WriteInfo(HGBASE_INFOTYPE_DEBUG, "MSG_XFERREADY"); while (1)
event = HGTWAIN_DSEVENT_XFERREADY; {
HGImage image = NULL;
p->m_listDSImpl[i]->ImageNativeXfer(0, 0, &image);
if (NULL != image)
{
if (NULL != p->m_listDSImpl[i]->m_imageFunc)
p->m_listDSImpl[i]->m_imageFunc((HGTwainDS)p->m_listDSImpl[i], image, p->m_listDSImpl[i]->m_imageParam);
HGBase_DestroyImage(image);
}
HGUInt count = 0;
p->m_listDSImpl[i]->EndXfer(&count);
if (0 == count)
{
break;
}
}
p->m_listDSImpl[i]->Reset();
} }
else if (MSG_CLOSEDSREQ == twEvent.TWMessage) else if (MSG_CLOSEDSREQ == twEvent.TWMessage/* || MSG_CLOSEDSOK == twEvent.TWMessage*/)
{ {
HGBase_WriteInfo(HGBASE_INFOTYPE_DEBUG, "MSG_CLOSEDSREQ"); if (NULL != p->m_listDSImpl[i]->m_eventFunc)
event = HGTWAIN_DSEVENT_CLOSEDSREQ; p->m_listDSImpl[i]->m_eventFunc((HGTwainDS)p->m_listDSImpl[i], HGBASE_ERR_OK, NULL, p->m_listDSImpl[i]->m_eventParam);
} }
else if (MSG_CLOSEDSOK == twEvent.TWMessage)
{
HGBase_WriteInfo(HGBASE_INFOTYPE_DEBUG, "MSG_CLOSEDSOK");
event = HGTWAIN_DSEVENT_CLOSEDSOK;
}
if (NULL != p->m_vpDSImpl[i]->m_eventFunc)
p->m_vpDSImpl[i]->m_eventFunc((HGTwainDS)p->m_vpDSImpl[i], event, p->m_vpDSImpl[i]->m_eventParam);
} }
} }
} }
@ -291,15 +307,17 @@ LRESULT CALLBACK HGTwainDSMImpl::NewWndProc(HWND hWnd, UINT msg, WPARAM wParam,
} }
HGTwainDSImpl::HGTwainDSImpl(HGTwainDSMImpl* dsmImpl, const TW_IDENTITY* iden) HGTwainDSImpl::HGTwainDSImpl(HGTwainDSMImpl* dsmImpl)
{ {
m_dsmImpl = dsmImpl; m_dsmImpl = dsmImpl;
memcpy(&m_iden, iden, sizeof(TW_IDENTITY)); memset(&m_iden, 0, sizeof(TW_IDENTITY));
m_open = HGFALSE; m_open = HGFALSE;
m_showUI = HGFALSE; m_showUI = HGFALSE;
m_parent = NULL; m_parent = NULL;
m_eventFunc = NULL; m_eventFunc = NULL;
m_eventParam = NULL; m_eventParam = NULL;
m_imageFunc = NULL;
m_imageParam = NULL;
m_enable = HGFALSE; m_enable = HGFALSE;
} }
@ -308,136 +326,35 @@ HGTwainDSImpl::~HGTwainDSImpl()
} }
HGResult HGTwainDSImpl::GetName(HGChar* name, HGUInt maxLen) HGResult HGTwainDSImpl::Open(const TW_IDENTITY* iden)
{ {
strcpy_s(name, maxLen, m_iden.ProductName); assert(!m_open);
return HGBASE_ERR_OK;
}
HGResult HGTwainDSImpl::Open()
{
if (m_open)
{
return HGBASE_ERR_FAIL;
}
USHORT ret = m_dsmImpl->m_pDSMProc(&m_dsmImpl->m_AppId, NULL, DG_CONTROL, DAT_IDENTITY, MSG_OPENDS, &m_iden); USHORT ret = m_dsmImpl->m_pDSMProc(&m_dsmImpl->m_AppId, NULL, DG_CONTROL, DAT_IDENTITY, MSG_OPENDS, &m_iden);
if (TWRC_SUCCESS != ret) if (TWRC_SUCCESS != ret)
{ {
return HGBASE_ERR_FAIL; return HGTWAIN_ERR_FAIL;
} }
memcpy(&m_iden, iden, sizeof(TW_IDENTITY));
m_open = HGTRUE; m_open = HGTRUE;
return HGBASE_ERR_OK; return HGBASE_ERR_OK;
} }
HGResult HGTwainDSImpl::Close() HGResult HGTwainDSImpl::Close()
{ {
if (!m_open) assert(m_open);
{
return HGBASE_ERR_FAIL;
}
Disable(); Disable();
m_dsmImpl->m_pDSMProc(&m_dsmImpl->m_AppId, NULL, DG_CONTROL, DAT_IDENTITY, MSG_CLOSEDS, (TW_MEMREF)&m_iden); m_dsmImpl->m_pDSMProc(&m_dsmImpl->m_AppId, NULL, DG_CONTROL, DAT_IDENTITY, MSG_CLOSEDS, (TW_MEMREF)&m_iden);
m_open = HGFALSE; m_open = HGFALSE;
m_dsmImpl->RemoveDS(this);
return HGBASE_ERR_OK; return HGBASE_ERR_OK;
} }
HGResult HGTwainDSImpl::SetCap(HGUInt cap, HGInt value) HGResult HGTwainDSImpl::EnableUIOnly(HGBool showUI, HWND parent, HGDSEventFunc eventFunc, HGPointer eventParam)
{ {
if (!m_open) if (m_enable)
{
return HGBASE_ERR_FAIL;
}
TW_UINT16 cap2 = 0;
if (HGTWAIN_DSCAP_DUPLEX == cap)
cap2 = CAP_DUPLEX;
else if (HGTWAIN_DSCAP_DUPLEXENABLED == cap)
cap2 = CAP_DUPLEXENABLED;
else if (HGTWAIN_DSCAP_XFERCOUNT == cap)
cap2 = CAP_XFERCOUNT;
if (0 == cap2)
{
return HGBASE_ERR_FAIL;
}
TW_CAPABILITY twCap;
twCap.Cap = (TW_UINT16)cap2;
twCap.ConType = TWON_ONEVALUE;
twCap.hContainer = GlobalAlloc(GHND, sizeof(TW_ONEVALUE));
if (NULL == twCap.hContainer)
{
return HGBASE_ERR_FAIL;
}
pTW_ONEVALUE pVal = (pTW_ONEVALUE)GlobalLock(twCap.hContainer);
assert(NULL != pVal);
pVal->ItemType = TWTY_INT32;
pVal->Item = (TW_UINT32)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 HGBASE_ERR_FAIL;
}
GlobalFree(twCap.hContainer);
return HGBASE_ERR_OK;
}
HGResult HGTwainDSImpl::GetCap(HGUInt cap, HGInt* value)
{
if (!m_open)
{
return HGBASE_ERR_FAIL;
}
if (NULL == value)
{
return HGBASE_ERR_INVALIDARG;
}
TW_UINT16 cap2 = 0;
if (HGTWAIN_DSCAP_DUPLEX == cap)
cap2 = CAP_DUPLEX;
else if (HGTWAIN_DSCAP_DUPLEXENABLED == cap)
cap2 = CAP_DUPLEXENABLED;
else if (HGTWAIN_DSCAP_XFERCOUNT == cap)
cap2 = CAP_XFERCOUNT;
if (0 == cap2)
{
return HGBASE_ERR_FAIL;
}
TW_CAPABILITY twCap;
twCap.Cap = (TW_UINT16)cap2;
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)
{
return HGBASE_ERR_FAIL;
}
assert(NULL != twCap.hContainer);
pTW_ONEVALUE pVal = (pTW_ONEVALUE)GlobalLock(twCap.hContainer);
assert(NULL != pVal);
*value = pVal->Item;
GlobalUnlock(twCap.hContainer);
GlobalFree(twCap.hContainer);
return HGBASE_ERR_OK;
}
HGResult HGTwainDSImpl::EnableUIOnly(HGBool showUI, HWND parent, HGDSEventFunc func, HGPointer param)
{
if (!m_open || m_enable)
{ {
return HGBASE_ERR_FAIL; return HGBASE_ERR_FAIL;
} }
@ -448,20 +365,23 @@ HGResult HGTwainDSImpl::EnableUIOnly(HGBool showUI, HWND parent, HGDSEventFunc f
USHORT ret = m_dsmImpl->m_pDSMProc(&m_dsmImpl->m_AppId, &m_iden, DG_CONTROL, DAT_USERINTERFACE, MSG_ENABLEDSUIONLY, (TW_MEMREF)&twUI); USHORT ret = m_dsmImpl->m_pDSMProc(&m_dsmImpl->m_AppId, &m_iden, DG_CONTROL, DAT_USERINTERFACE, MSG_ENABLEDSUIONLY, (TW_MEMREF)&twUI);
if (TWRC_SUCCESS != ret) if (TWRC_SUCCESS != ret)
{ {
return HGBASE_ERR_FAIL; return HGTWAIN_ERR_FAIL;
} }
m_showUI = showUI; m_showUI = showUI;
m_parent = parent; m_parent = parent;
m_eventFunc = func; m_eventFunc = eventFunc;
m_eventParam = param; m_eventParam = eventParam;
m_imageFunc = NULL;
m_imageParam = NULL;
m_enable = HGTRUE; m_enable = HGTRUE;
return HGBASE_ERR_OK; return HGBASE_ERR_OK;
} }
HGResult HGTwainDSImpl::Enable(HGBool showUI, HWND parent, HGDSEventFunc func, HGPointer param) HGResult HGTwainDSImpl::Enable(HGBool showUI, HWND parent, HGDSEventFunc eventFunc, HGPointer eventParam,
HGDSImageFunc imageFunc, HGPointer imageParam)
{ {
if (!m_open || m_enable) if (m_enable)
{ {
return HGBASE_ERR_FAIL; return HGBASE_ERR_FAIL;
} }
@ -472,13 +392,15 @@ HGResult HGTwainDSImpl::Enable(HGBool showUI, HWND parent, HGDSEventFunc func, H
USHORT ret = m_dsmImpl->m_pDSMProc(&m_dsmImpl->m_AppId, &m_iden, DG_CONTROL, DAT_USERINTERFACE, MSG_ENABLEDS, (TW_MEMREF)&twUI); USHORT ret = m_dsmImpl->m_pDSMProc(&m_dsmImpl->m_AppId, &m_iden, DG_CONTROL, DAT_USERINTERFACE, MSG_ENABLEDS, (TW_MEMREF)&twUI);
if (TWRC_SUCCESS != ret) if (TWRC_SUCCESS != ret)
{ {
return HGBASE_ERR_FAIL; return HGTWAIN_ERR_FAIL;
} }
m_showUI = showUI; m_showUI = showUI;
m_parent = parent; m_parent = parent;
m_eventFunc = func; m_eventFunc = eventFunc;
m_eventParam = param; m_eventParam = eventParam;
m_imageFunc = imageFunc;
m_imageParam = imageParam;
m_enable = HGTRUE; m_enable = HGTRUE;
return HGBASE_ERR_OK; return HGBASE_ERR_OK;
} }
@ -499,10 +421,68 @@ HGResult HGTwainDSImpl::Disable()
m_parent = NULL; m_parent = NULL;
m_eventFunc = NULL; m_eventFunc = NULL;
m_eventParam = NULL; m_eventParam = NULL;
m_imageFunc = NULL;
m_imageParam = NULL;
m_enable = HGFALSE; m_enable = HGFALSE;
return HGBASE_ERR_OK; return HGBASE_ERR_OK;
} }
HGResult HGTwainDSImpl::SetCap(HGUInt cap, HGInt value)
{
TW_CAPABILITY twCap;
twCap.Cap = (TW_UINT16)cap;
twCap.ConType = TWON_ONEVALUE;
twCap.hContainer = GlobalAlloc(GHND, sizeof(TW_ONEVALUE));
if (NULL == twCap.hContainer)
{
return HGBASE_ERR_FAIL;
}
pTW_ONEVALUE pVal = (pTW_ONEVALUE)GlobalLock(twCap.hContainer);
assert(NULL != pVal);
pVal->ItemType = TWTY_INT32;
pVal->Item = (TW_UINT32)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;
}
HGResult HGTwainDSImpl::GetCap(HGUInt cap, HGInt* value)
{
if (NULL == value)
{
return HGBASE_ERR_INVALIDARG;
}
TW_CAPABILITY twCap;
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)
{
return HGTWAIN_ERR_FAIL;
}
assert(NULL != twCap.hContainer);
pTW_ONEVALUE pVal = (pTW_ONEVALUE)GlobalLock(twCap.hContainer);
assert(NULL != pVal);
*value = pVal->Item;
GlobalUnlock(twCap.hContainer);
GlobalFree(twCap.hContainer);
return HGBASE_ERR_OK;
}
HGResult HGTwainDSImpl::ImageNativeXfer(HGUInt type, HGUInt origin, HGImage* image) HGResult HGTwainDSImpl::ImageNativeXfer(HGUInt type, HGUInt origin, HGImage* image)
{ {
if (!m_enable) if (!m_enable)
@ -518,13 +498,13 @@ HGResult HGTwainDSImpl::ImageNativeXfer(HGUInt type, HGUInt origin, HGImage* ima
TW_IMAGEINFO info; TW_IMAGEINFO info;
if (TWRC_SUCCESS != m_dsmImpl->m_pDSMProc(&m_dsmImpl->m_AppId, &m_iden, DG_IMAGE, DAT_IMAGEINFO, MSG_GET, (TW_MEMREF)&info)) if (TWRC_SUCCESS != m_dsmImpl->m_pDSMProc(&m_dsmImpl->m_AppId, &m_iden, DG_IMAGE, DAT_IMAGEINFO, MSG_GET, (TW_MEMREF)&info))
{ {
return HGBASE_ERR_FAIL; return HGTWAIN_ERR_FAIL;
} }
HANDLE hMem = NULL; HANDLE hMem = NULL;
if (TWRC_XFERDONE != m_dsmImpl->m_pDSMProc(&m_dsmImpl->m_AppId, &m_iden, DG_IMAGE, DAT_IMAGENATIVEXFER, MSG_GET, &hMem)) if (TWRC_XFERDONE != m_dsmImpl->m_pDSMProc(&m_dsmImpl->m_AppId, &m_iden, DG_IMAGE, DAT_IMAGENATIVEXFER, MSG_GET, &hMem))
{ {
return HGBASE_ERR_FAIL; return HGTWAIN_ERR_FAIL;
} }
HGResult ret = HGBase_CreateImageFromDIB(hMem, NULL, type, origin, image); HGResult ret = HGBase_CreateImageFromDIB(hMem, NULL, type, origin, image);
@ -548,7 +528,7 @@ HGResult HGTwainDSImpl::EndXfer(HGUInt* count)
USHORT ret = m_dsmImpl->m_pDSMProc(&m_dsmImpl->m_AppId, &m_iden, DG_CONTROL, DAT_PENDINGXFERS, MSG_ENDXFER, (TW_MEMREF)&twPend); USHORT ret = m_dsmImpl->m_pDSMProc(&m_dsmImpl->m_AppId, &m_iden, DG_CONTROL, DAT_PENDINGXFERS, MSG_ENDXFER, (TW_MEMREF)&twPend);
if (TWRC_SUCCESS != ret) if (TWRC_SUCCESS != ret)
{ {
return HGBASE_ERR_FAIL; return HGTWAIN_ERR_FAIL;
} }
*count = twPend.Count; *count = twPend.Count;
@ -566,7 +546,7 @@ HGResult HGTwainDSImpl::Reset()
USHORT ret = m_dsmImpl->m_pDSMProc(&m_dsmImpl->m_AppId, &m_iden, DG_CONTROL, DAT_PENDINGXFERS, MSG_RESET, (TW_MEMREF)&twPend); USHORT ret = m_dsmImpl->m_pDSMProc(&m_dsmImpl->m_AppId, &m_iden, DG_CONTROL, DAT_PENDINGXFERS, MSG_RESET, (TW_MEMREF)&twPend);
if (TWRC_SUCCESS != ret) if (TWRC_SUCCESS != ret)
{ {
return HGBASE_ERR_FAIL; return HGTWAIN_ERR_FAIL;
} }
return HGBASE_ERR_OK; return HGBASE_ERR_OK;

View File

@ -14,16 +14,16 @@ public:
HGTwainDSMImpl(); HGTwainDSMImpl();
~HGTwainDSMImpl(); ~HGTwainDSMImpl();
HGResult LoadDSM(); HGResult Create(HWND hwnd);
HGResult UnloadDSM(); HGResult Destroy();
HGResult OpenDSM(HWND hwnd); HGResult GetDSCount(HGUInt* count);
HGResult CloseDSM(); HGResult GetDSName(HGUInt index, HGChar* name, HGUInt maxLen);
HGResult GetDSList(class HGTwainDSImpl** dsImpl, HGUInt* size); HGResult OpenDS(HGUInt index, class HGTwainDSImpl** dsImpl);
HGResult GetDefaultDS(class HGTwainDSImpl** dsImpl); HGResult OpenDefaultDS(class HGTwainDSImpl** dsImpl);
HGResult SelectDS(class HGTwainDSImpl** dsImpl); HGResult OpenSelectedDS(class HGTwainDSImpl** dsImpl);
private: private:
void GetIdentity(); void RemoveDS(class HGTwainDSImpl* dsImpl);
static LRESULT CALLBACK NewWndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam); static LRESULT CALLBACK NewWndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam);
private: private:
@ -33,26 +33,27 @@ private:
HWND m_hWnd; HWND m_hWnd;
static std::map<HWND, HGTwainDSMImpl*> m_mapWnd; static std::map<HWND, HGTwainDSMImpl*> m_mapWnd;
WNDPROC m_oldWndProc; WNDPROC m_oldWndProc;
HGBool m_DSMOpen; std::vector<class HGTwainDSImpl *> m_listDSImpl;
std::vector<class HGTwainDSImpl *> m_vpDSImpl;
}; };
class HGTwainDSImpl class HGTwainDSImpl
{ {
friend class HGTwainDSMImpl; friend class HGTwainDSMImpl;
public: public:
HGTwainDSImpl(HGTwainDSMImpl* dsmImpl, const TW_IDENTITY *iden); HGTwainDSImpl(HGTwainDSMImpl* dsmImpl);
~HGTwainDSImpl(); ~HGTwainDSImpl();
public: public:
HGResult GetName(HGChar* name, HGUInt maxLen); HGResult Open(const TW_IDENTITY* iden);
HGResult Open();
HGResult Close(); HGResult Close();
HGResult EnableUIOnly(HGBool showUI, HWND parent, HGDSEventFunc eventFunc, HGPointer eventParam);
HGResult Enable(HGBool showUI, HWND parent, HGDSEventFunc eventFunc, HGPointer eventParam,
HGDSImageFunc imageFunc, HGPointer imageParam);
HGResult Disable();
private:
HGResult SetCap(HGUInt cap, HGInt value); HGResult SetCap(HGUInt cap, HGInt value);
HGResult GetCap(HGUInt cap, HGInt* value); HGResult GetCap(HGUInt cap, HGInt* value);
HGResult EnableUIOnly(HGBool showUI, HWND parent, HGDSEventFunc func, HGPointer param);
HGResult Enable(HGBool showUI, HWND parent, HGDSEventFunc func, HGPointer param);
HGResult Disable();
HGResult ImageNativeXfer(HGUInt type, HGUInt origin, HGImage* image); HGResult ImageNativeXfer(HGUInt type, HGUInt origin, HGImage* image);
HGResult EndXfer(HGUInt* count); HGResult EndXfer(HGUInt* count);
HGResult Reset(); HGResult Reset();
@ -65,6 +66,8 @@ private:
HWND m_parent; HWND m_parent;
HGDSEventFunc m_eventFunc; HGDSEventFunc m_eventFunc;
HGPointer m_eventParam; HGPointer m_eventParam;
HGDSImageFunc m_imageFunc;
HGPointer m_imageParam;
HGBool m_enable; HGBool m_enable;
}; };