将twain_user接口和sane_user接口统一成一种风格
This commit is contained in:
parent
42d3ef90ee
commit
f1a4f34f5a
|
@ -129,8 +129,7 @@ BOOL CHGTestDlg::OnInitDialog()
|
|||
#ifdef USE_SANE
|
||||
HGSane_CreateManager("sane.dll", &m_saneMgr);
|
||||
#else
|
||||
HGTwain_LoadDSM(&m_dsm);
|
||||
HGTwain_OpenDSM(m_dsm, m_hWnd);
|
||||
HGTwain_CreateDSM(m_hWnd, &m_dsm);
|
||||
#endif
|
||||
|
||||
return TRUE; // 除非将焦点设置到控件,否则返回 TRUE
|
||||
|
@ -207,11 +206,12 @@ void CHGTestDlg::OnBnClickedButton1()
|
|||
return;
|
||||
}
|
||||
|
||||
HGTwain_SelectDS(m_dsm, &m_ds);
|
||||
if (NULL != m_ds)
|
||||
HGTwain_OpenSelectedDS(m_dsm, &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_EnableDS(m_ds, HGTRUE, m_hWnd, DSEventCallback, this);
|
||||
HGTwain_CloseDS(m_ds);
|
||||
m_ds = NULL;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
@ -237,50 +237,25 @@ void HGAPI CHGTestDlg::DeviceEventCallback(HGSaneDevice dev, HGUInt error, const
|
|||
void HGAPI CHGTestDlg::DeviceImageCallback(HGSaneDevice dev, HGImage image, HGPointer param)
|
||||
{
|
||||
CHGTestDlg* p = (CHGTestDlg*)param;
|
||||
|
||||
CStringA strName;
|
||||
strName.Format("D:\\HGTest_%u.jpg", p->m_idx++);
|
||||
HGImgFmt_SaveImage(image, 0, NULL, strName);
|
||||
}
|
||||
#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;
|
||||
if (HGTWAIN_DSEVENT_XFERREADY == event)
|
||||
{
|
||||
while (1)
|
||||
{
|
||||
HGImage image = NULL;
|
||||
HGTwain_ImageNativeXfer(p->m_ds, 0, 0, &image);
|
||||
CStringA strName;
|
||||
strName.Format("D:\\Twain_%u.jpg", p->m_idx++);
|
||||
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;
|
||||
}
|
||||
::PostMessage(p->m_hWnd, 2000, 0, 0);
|
||||
}
|
||||
void HGAPI CHGTestDlg::DSImageCallback(HGTwainDS ds, HGImage image, HGPointer param)
|
||||
{
|
||||
CHGTestDlg* p = (CHGTestDlg*)param;
|
||||
CStringA strName;
|
||||
strName.Format("D:\\HGTest_%u.jpg", p->m_idx++);
|
||||
HGImgFmt_SaveImage(image, 0, NULL, strName);
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
LRESULT CHGTestDlg::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
|
||||
{
|
||||
if (2000 == message)
|
||||
|
@ -288,6 +263,9 @@ LRESULT CHGTestDlg::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
|
|||
#ifdef USE_SANE
|
||||
HGSane_CloseDevice(m_saneDev);
|
||||
m_saneDev = NULL;
|
||||
#else
|
||||
HGTwain_CloseDS(m_ds);
|
||||
m_ds = NULL;
|
||||
#endif
|
||||
}
|
||||
|
||||
|
|
|
@ -30,7 +30,8 @@ protected:
|
|||
#else
|
||||
HGTwainDSM m_dsm;
|
||||
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
|
||||
|
||||
// 实现
|
||||
|
|
|
@ -2,21 +2,14 @@ LIBRARY
|
|||
|
||||
EXPORTS
|
||||
|
||||
HGTwain_LoadDSM
|
||||
HGTwain_UnloadDSM
|
||||
HGTwain_OpenDSM
|
||||
HGTwain_CloseDSM
|
||||
HGTwain_GetDSList
|
||||
HGTwain_GetDefaultDS
|
||||
HGTwain_SelectDS
|
||||
HGTwain_CreateDSM
|
||||
HGTwain_DestroyDSM
|
||||
HGTwain_GetDSCount
|
||||
HGTwain_GetDSName
|
||||
HGTwain_OpenDS
|
||||
HGTwain_OpenDefaultDS
|
||||
HGTwain_OpenSelectedDS
|
||||
HGTwain_CloseDS
|
||||
HGTwain_SetCapability
|
||||
HGTwain_GetCapability
|
||||
HGTwain_EnableDSUIOnly
|
||||
HGTwain_EnableDS
|
||||
HGTwain_DisableDS
|
||||
HGTwain_ImageNativeXfer
|
||||
HGTwain_EndXfer
|
||||
HGTwain_Reset
|
||||
|
|
|
@ -10,7 +10,7 @@
|
|||
HG_DECLARE_HANDLE(HGSaneManager);
|
||||
HG_DECLARE_HANDLE(HGSaneDevice);
|
||||
|
||||
/* Sane设备回调
|
||||
/* Sane回调
|
||||
*/
|
||||
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);
|
||||
|
|
|
@ -26,10 +26,7 @@ HGSaneManagerImpl::~HGSaneManagerImpl()
|
|||
|
||||
HGResult HGSaneManagerImpl::Create(const HGChar* sanePath)
|
||||
{
|
||||
if (NULL != m_dll)
|
||||
{
|
||||
return HGBASE_ERR_FAIL;
|
||||
}
|
||||
assert(NULL == m_dll);
|
||||
|
||||
HGResult ret = HGBase_CreateDll(sanePath, &m_dll);
|
||||
if (HGBASE_ERR_OK != ret)
|
||||
|
@ -57,18 +54,16 @@ HGResult HGSaneManagerImpl::Create(const HGChar* sanePath)
|
|||
|
||||
HGResult HGSaneManagerImpl::Destroy()
|
||||
{
|
||||
assert(NULL != m_dll);
|
||||
|
||||
if (!m_listDeviceImpl.empty())
|
||||
{
|
||||
return HGBASE_ERR_FAIL;
|
||||
}
|
||||
|
||||
if (NULL != m_dll)
|
||||
{
|
||||
m_f_sane_exit();
|
||||
HGBase_DestroyDll(m_dll);
|
||||
m_dll = NULL;
|
||||
}
|
||||
|
||||
m_f_sane_exit();
|
||||
HGBase_DestroyDll(m_dll);
|
||||
m_dll = NULL;
|
||||
return HGBASE_ERR_OK;
|
||||
}
|
||||
|
||||
|
@ -256,10 +251,7 @@ HGSaneDeviceImpl::~HGSaneDeviceImpl()
|
|||
|
||||
HGResult HGSaneDeviceImpl::Open(const HGChar* devName, HGChar* errInfo, HGUInt errInfoLen)
|
||||
{
|
||||
if (NULL != m_devHandle)
|
||||
{
|
||||
return HGBASE_ERR_FAIL;
|
||||
}
|
||||
assert(NULL == m_devHandle);
|
||||
|
||||
if (NULL == devName)
|
||||
{
|
||||
|
@ -289,10 +281,7 @@ HGResult HGSaneDeviceImpl::Open(const HGChar* devName, HGChar* errInfo, HGUInt e
|
|||
|
||||
HGResult HGSaneDeviceImpl::Close()
|
||||
{
|
||||
if (NULL == m_devHandle)
|
||||
{
|
||||
return HGBASE_ERR_FAIL;
|
||||
}
|
||||
assert(NULL != m_devHandle);
|
||||
|
||||
Stop();
|
||||
m_mgrImpl->m_f_sane_close(m_devHandle);
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
#include "HGTwain.h"
|
||||
#include "HGTwainImpl.hpp"
|
||||
|
||||
HGResult HGAPI HGTwain_LoadDSM(HGTwainDSM* dsm)
|
||||
HGResult HGAPI HGTwain_CreateDSM(HWND hwnd, HGTwainDSM* dsm)
|
||||
{
|
||||
if (NULL == dsm)
|
||||
{
|
||||
|
@ -9,7 +9,7 @@ HGResult HGAPI HGTwain_LoadDSM(HGTwainDSM* dsm)
|
|||
}
|
||||
|
||||
HGTwainDSMImpl* twainDSMImpl = new HGTwainDSMImpl;
|
||||
HGResult ret = twainDSMImpl->LoadDSM();
|
||||
HGResult ret = twainDSMImpl->Create(hwnd);
|
||||
if (HGBASE_ERR_OK != ret)
|
||||
{
|
||||
delete twainDSMImpl;
|
||||
|
@ -20,7 +20,7 @@ HGResult HGAPI HGTwain_LoadDSM(HGTwainDSM* dsm)
|
|||
return HGBASE_ERR_OK;
|
||||
}
|
||||
|
||||
HGResult HGAPI HGTwain_UnloadDSM(HGTwainDSM dsm)
|
||||
HGResult HGAPI HGTwain_DestroyDSM(HGTwainDSM dsm)
|
||||
{
|
||||
if (NULL == dsm)
|
||||
{
|
||||
|
@ -28,7 +28,7 @@ HGResult HGAPI HGTwain_UnloadDSM(HGTwainDSM dsm)
|
|||
}
|
||||
|
||||
HGTwainDSMImpl* twainDSMImpl = (HGTwainDSMImpl*)dsm;
|
||||
HGResult ret = twainDSMImpl->UnloadDSM();
|
||||
HGResult ret = twainDSMImpl->Destroy();
|
||||
if (HGBASE_ERR_OK != ret)
|
||||
{
|
||||
return ret;
|
||||
|
@ -38,7 +38,7 @@ HGResult HGAPI HGTwain_UnloadDSM(HGTwainDSM dsm)
|
|||
return HGBASE_ERR_OK;
|
||||
}
|
||||
|
||||
HGResult HGAPI HGTwain_OpenDSM(HGTwainDSM dsm, HWND hwnd)
|
||||
HGResult HGAPI HGTwain_GetDSCount(HGTwainDSM dsm, HGUInt* count)
|
||||
{
|
||||
if (NULL == dsm)
|
||||
{
|
||||
|
@ -46,10 +46,10 @@ HGResult HGAPI HGTwain_OpenDSM(HGTwainDSM dsm, HWND hwnd)
|
|||
}
|
||||
|
||||
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)
|
||||
{
|
||||
|
@ -57,10 +57,10 @@ HGResult HGAPI HGTwain_CloseDSM(HGTwainDSM 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)
|
||||
{
|
||||
|
@ -68,10 +68,18 @@ HGResult HGAPI HGTwain_GetDSList(HGTwainDSM dsm, HGTwainDS* ds, HGUInt* size)
|
|||
}
|
||||
|
||||
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)
|
||||
{
|
||||
|
@ -79,10 +87,18 @@ HGResult HGAPI HGTwain_GetDefaultDS(HGTwainDSM dsm, HGTwainDS* ds)
|
|||
}
|
||||
|
||||
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)
|
||||
{
|
||||
|
@ -90,29 +106,15 @@ HGResult HGAPI HGTwain_SelectDS(HGTwainDSM dsm, HGTwainDS* ds)
|
|||
}
|
||||
|
||||
HGTwainDSMImpl* twainDSMImpl = (HGTwainDSMImpl*)dsm;
|
||||
return twainDSMImpl->SelectDS((HGTwainDSImpl**)ds);
|
||||
}
|
||||
|
||||
HGResult HGAPI HGTwain_GetDSName(HGTwainDS ds, HGChar* name, HGUInt maxLen)
|
||||
{
|
||||
if (NULL == ds)
|
||||
class HGTwainDSImpl* dsImpl = NULL;
|
||||
HGResult ret = twainDSMImpl->OpenSelectedDS(&dsImpl);
|
||||
if (HGBASE_ERR_OK != ret)
|
||||
{
|
||||
return HGBASE_ERR_INVALIDARG;
|
||||
return ret;
|
||||
}
|
||||
|
||||
HGTwainDSImpl* twainDSImpl = (HGTwainDSImpl*)ds;
|
||||
return twainDSImpl->GetName(name, maxLen);
|
||||
}
|
||||
|
||||
HGResult HGAPI HGTwain_OpenDS(HGTwainDS ds)
|
||||
{
|
||||
if (NULL == ds)
|
||||
{
|
||||
return HGBASE_ERR_INVALIDARG;
|
||||
}
|
||||
|
||||
HGTwainDSImpl* twainDSImpl = (HGTwainDSImpl*)ds;
|
||||
return twainDSImpl->Open();
|
||||
*ds = (HGTwainDS)dsImpl;
|
||||
return HGBASE_ERR_OK;
|
||||
}
|
||||
|
||||
HGResult HGAPI HGTwain_CloseDS(HGTwainDS ds)
|
||||
|
@ -126,7 +128,7 @@ HGResult HGAPI HGTwain_CloseDS(HGTwainDS ds)
|
|||
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)
|
||||
{
|
||||
|
@ -134,10 +136,11 @@ HGResult HGAPI HGTwain_SetCapability(HGTwainDS ds, HGUInt cap, HGInt value)
|
|||
}
|
||||
|
||||
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)
|
||||
{
|
||||
|
@ -145,29 +148,7 @@ HGResult HGAPI HGTwain_GetCapability(HGTwainDS ds, HGUInt cap, HGInt* value)
|
|||
}
|
||||
|
||||
HGTwainDSImpl* twainDSImpl = (HGTwainDSImpl*)ds;
|
||||
return twainDSImpl->GetCap(cap, value);
|
||||
}
|
||||
|
||||
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);
|
||||
return twainDSImpl->Enable(showUI, parent, eventFunc, eventParam, imageFunc, imageParam);
|
||||
}
|
||||
|
||||
HGResult HGAPI HGTwain_DisableDS(HGTwainDS ds)
|
||||
|
@ -180,36 +161,3 @@ HGResult HGAPI HGTwain_DisableDS(HGTwainDS ds)
|
|||
HGTwainDSImpl* twainDSImpl = (HGTwainDSImpl*)ds;
|
||||
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();
|
||||
}
|
|
@ -9,199 +9,32 @@
|
|||
HG_DECLARE_HANDLE(HGTwainDSM);
|
||||
HG_DECLARE_HANDLE(HGTwainDS);
|
||||
|
||||
/* 能力 */
|
||||
#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
|
||||
/* 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
|
||||
* 参数:
|
||||
* 1) dsm: out, DSM句柄
|
||||
* 说明:
|
||||
* 1) 执行此函数后,TWAIN状态从1变为2
|
||||
*/
|
||||
HGEXPORT HGResult HGAPI HGTwain_LoadDSM(HGTwainDSM *dsm);
|
||||
HGEXPORT HGResult HGAPI HGTwain_CreateDSM(HWND hwnd, HGTwainDSM *dsm);
|
||||
|
||||
/* 卸载DSM
|
||||
* 参数:
|
||||
* 1) dsm: in, DSM句柄
|
||||
* 说明:
|
||||
* 1) 执行此函数后,TWAIN状态从2变为1
|
||||
*/
|
||||
HGEXPORT HGResult HGAPI HGTwain_UnloadDSM(HGTwainDSM dsm);
|
||||
HGEXPORT HGResult HGAPI HGTwain_DestroyDSM(HGTwainDSM dsm);
|
||||
|
||||
/* 打开DSM
|
||||
* 参数:
|
||||
* 1) dsm: in, DSM句柄
|
||||
* 说明:
|
||||
* 1) 执行此函数后,TWAIN状态从2变为3
|
||||
* 2) 调用该函数的线程需要有消息循环
|
||||
*/
|
||||
HGEXPORT HGResult HGAPI HGTwain_OpenDSM(HGTwainDSM dsm, HWND hwnd);
|
||||
HGEXPORT HGResult HGAPI HGTwain_GetDSCount(HGTwainDSM dsm, HGUInt* count);
|
||||
|
||||
/* 关闭DSM
|
||||
* 参数:
|
||||
* 1) dsm: in, DSM句柄
|
||||
* 说明:
|
||||
* 1) 执行此函数后,TWAIN状态从3变为2
|
||||
*/
|
||||
HGEXPORT HGResult HGAPI HGTwain_CloseDSM(HGTwainDSM dsm);
|
||||
HGEXPORT HGResult HGAPI HGTwain_GetDSName(HGTwainDSM dsm, HGUInt index, HGChar* name, HGUInt maxLen);
|
||||
|
||||
/* 获取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);
|
||||
HGEXPORT HGResult HGAPI HGTwain_OpenDS(HGTwainDSM dsm, HGUInt index, HGTwainDS *ds);
|
||||
|
||||
/* 获取默认的DS
|
||||
* 参数:
|
||||
* 1) dsm: in, DSM句柄
|
||||
* 2) ds: out, DS句柄
|
||||
* 说明:
|
||||
* 1) 该函数需要TWAIN状态为3
|
||||
*/
|
||||
HGEXPORT HGResult HGAPI HGTwain_GetDefaultDS(HGTwainDSM dsm, HGTwainDS* ds);
|
||||
HGEXPORT HGResult HGAPI HGTwain_OpenDefaultDS(HGTwainDSM dsm, HGTwainDS* ds);
|
||||
|
||||
/* 弹出DS选择框,并返回选择的DS
|
||||
* 参数:
|
||||
* 1) dsm: in, DSM句柄
|
||||
* 2) ds: out, DS句柄
|
||||
* 说明:
|
||||
* 1) 该函数需要TWAIN状态为3
|
||||
*/
|
||||
HGEXPORT HGResult HGAPI HGTwain_SelectDS(HGTwainDSM dsm, HGTwainDS* ds);
|
||||
HGEXPORT HGResult HGAPI HGTwain_OpenSelectedDS(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);
|
||||
|
||||
/* 设置DS的能力
|
||||
* 参数:
|
||||
* 1) ds: in, DS句柄
|
||||
* 2) cap: in, 能力
|
||||
* 3) value: in, 值
|
||||
* 说明:
|
||||
* 1) 该函数需要TWAIN状态为4
|
||||
*/
|
||||
HGEXPORT HGResult HGAPI HGTwain_SetCapability(HGTwainDS ds, HGUInt cap, HGInt value);
|
||||
HGEXPORT HGResult HGAPI HGTwain_EnableDSUIOnly(HGTwainDS ds, HGBool showUI, HWND parent, HGDSEventFunc eventFunc, HGPointer eventParam);
|
||||
|
||||
/* 获取DS的能力
|
||||
* 参数:
|
||||
* 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);
|
||||
HGEXPORT HGResult HGAPI HGTwain_EnableDS(HGTwainDS ds, HGBool showUI, HWND parent, HGDSEventFunc eventFunc, HGPointer eventParam,
|
||||
HGDSImageFunc imageFunc, HGPointer imageParam);
|
||||
|
||||
/* 启动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);
|
||||
|
||||
/* 本地传输图像
|
||||
* 参数:
|
||||
* 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__ */
|
|
@ -8,22 +8,36 @@ HGTwainDSMImpl::HGTwainDSMImpl()
|
|||
{
|
||||
m_hDll = 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_oldWndProc = NULL;
|
||||
m_DSMOpen = HGFALSE;
|
||||
}
|
||||
|
||||
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);
|
||||
|
@ -33,6 +47,7 @@ HGResult HGTwainDSMImpl::LoadDSM()
|
|||
return HGBASE_ERR_FAIL;
|
||||
}
|
||||
|
||||
assert(NULL == m_pDSMProc);
|
||||
HGBase_GetDllProcAddress(m_hDll, MAKEINTRESOURCEA(1), (HGPointer*)&m_pDSMProc);
|
||||
if (NULL == m_pDSMProc)
|
||||
{
|
||||
|
@ -41,81 +56,30 @@ HGResult HGTwainDSMImpl::LoadDSM()
|
|||
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);
|
||||
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_mapWnd[m_hWnd] = this;
|
||||
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;
|
||||
}
|
||||
|
||||
HGResult HGTwainDSMImpl::CloseDSM()
|
||||
HGResult HGTwainDSMImpl::Destroy()
|
||||
{
|
||||
if (!m_DSMOpen)
|
||||
assert(NULL != m_oldWndProc);
|
||||
|
||||
if (!m_listDSImpl.empty())
|
||||
{
|
||||
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);
|
||||
SetWindowLongPtrW(m_hWnd, GWLP_WNDPROC, (LONG_PTR)m_oldWndProc);
|
||||
m_oldWndProc = NULL;
|
||||
|
@ -129,117 +93,160 @@ HGResult HGTwainDSMImpl::CloseDSM()
|
|||
}
|
||||
}
|
||||
m_hWnd = NULL;
|
||||
m_DSMOpen = HGFALSE;
|
||||
|
||||
m_pDSMProc = NULL;
|
||||
HGBase_DestroyDll(m_hDll);
|
||||
m_hDll = NULL;
|
||||
return HGBASE_ERR_OK;
|
||||
}
|
||||
|
||||
HGResult HGTwainDSMImpl::GetDSList(class HGTwainDSImpl** dsImpl, HGUInt* size)
|
||||
HGResult HGTwainDSMImpl::GetDSCount(HGUInt* count)
|
||||
{
|
||||
if (!m_DSMOpen)
|
||||
{
|
||||
return HGBASE_ERR_FAIL;
|
||||
}
|
||||
|
||||
if (NULL == dsImpl || NULL == size || 0 == *size)
|
||||
if (NULL == count)
|
||||
{
|
||||
return HGBASE_ERR_INVALIDARG;
|
||||
}
|
||||
|
||||
HGUInt count = 0;
|
||||
for (int i = 0; i < (int)m_vpDSImpl.size(); ++i)
|
||||
HGUInt num = 0;
|
||||
TW_IDENTITY ds;
|
||||
if (TWRC_SUCCESS == m_pDSMProc(&m_AppId, NULL, DG_CONTROL, DAT_IDENTITY, MSG_GETFIRST, &ds))
|
||||
{
|
||||
dsImpl[i] = m_vpDSImpl[i];
|
||||
++count;
|
||||
|
||||
if (count >= *size)
|
||||
++num;
|
||||
while (TWRC_SUCCESS == m_pDSMProc(&m_AppId, NULL, DG_CONTROL, DAT_IDENTITY, MSG_GETNEXT, &ds))
|
||||
{
|
||||
++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;
|
||||
}
|
||||
}
|
||||
|
||||
*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)
|
||||
|
@ -253,36 +260,45 @@ LRESULT CALLBACK HGTwainDSMImpl::NewWndProc(HWND hWnd, UINT msg, WPARAM wParam,
|
|||
msg2.wParam = wParam;
|
||||
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;
|
||||
twEvent.pEvent = (TW_MEMREF)&msg2;
|
||||
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);
|
||||
if (TWRC_DSEVENT == ret)
|
||||
{
|
||||
HGUInt event = HGTWAIN_DSEVENT_UNKNOWN;
|
||||
if (MSG_XFERREADY == twEvent.TWMessage)
|
||||
{
|
||||
HGBase_WriteInfo(HGBASE_INFOTYPE_DEBUG, "MSG_XFERREADY");
|
||||
event = HGTWAIN_DSEVENT_XFERREADY;
|
||||
}
|
||||
else if (MSG_CLOSEDSREQ == twEvent.TWMessage)
|
||||
{
|
||||
HGBase_WriteInfo(HGBASE_INFOTYPE_DEBUG, "MSG_CLOSEDSREQ");
|
||||
event = HGTWAIN_DSEVENT_CLOSEDSREQ;
|
||||
}
|
||||
else if (MSG_CLOSEDSOK == twEvent.TWMessage)
|
||||
{
|
||||
HGBase_WriteInfo(HGBASE_INFOTYPE_DEBUG, "MSG_CLOSEDSOK");
|
||||
event = HGTWAIN_DSEVENT_CLOSEDSOK;
|
||||
}
|
||||
while (1)
|
||||
{
|
||||
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);
|
||||
}
|
||||
|
||||
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);
|
||||
HGUInt count = 0;
|
||||
p->m_listDSImpl[i]->EndXfer(&count);
|
||||
if (0 == count)
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
p->m_listDSImpl[i]->Reset();
|
||||
}
|
||||
else if (MSG_CLOSEDSREQ == twEvent.TWMessage/* || MSG_CLOSEDSOK == twEvent.TWMessage*/)
|
||||
{
|
||||
if (NULL != p->m_listDSImpl[i]->m_eventFunc)
|
||||
p->m_listDSImpl[i]->m_eventFunc((HGTwainDS)p->m_listDSImpl[i], HGBASE_ERR_OK, NULL, p->m_listDSImpl[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;
|
||||
memcpy(&m_iden, iden, sizeof(TW_IDENTITY));
|
||||
memset(&m_iden, 0, sizeof(TW_IDENTITY));
|
||||
m_open = HGFALSE;
|
||||
m_showUI = HGFALSE;
|
||||
m_parent = NULL;
|
||||
m_eventFunc = NULL;
|
||||
m_eventParam = NULL;
|
||||
m_imageFunc = NULL;
|
||||
m_imageParam = NULL;
|
||||
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);
|
||||
return HGBASE_ERR_OK;
|
||||
}
|
||||
|
||||
HGResult HGTwainDSImpl::Open()
|
||||
{
|
||||
if (m_open)
|
||||
{
|
||||
return HGBASE_ERR_FAIL;
|
||||
}
|
||||
assert(!m_open);
|
||||
|
||||
USHORT ret = m_dsmImpl->m_pDSMProc(&m_dsmImpl->m_AppId, NULL, DG_CONTROL, DAT_IDENTITY, MSG_OPENDS, &m_iden);
|
||||
if (TWRC_SUCCESS != ret)
|
||||
{
|
||||
return HGBASE_ERR_FAIL;
|
||||
return HGTWAIN_ERR_FAIL;
|
||||
}
|
||||
|
||||
memcpy(&m_iden, iden, sizeof(TW_IDENTITY));
|
||||
m_open = HGTRUE;
|
||||
return HGBASE_ERR_OK;
|
||||
}
|
||||
|
||||
HGResult HGTwainDSImpl::Close()
|
||||
{
|
||||
if (!m_open)
|
||||
{
|
||||
return HGBASE_ERR_FAIL;
|
||||
}
|
||||
assert(m_open);
|
||||
|
||||
Disable();
|
||||
m_dsmImpl->m_pDSMProc(&m_dsmImpl->m_AppId, NULL, DG_CONTROL, DAT_IDENTITY, MSG_CLOSEDS, (TW_MEMREF)&m_iden);
|
||||
|
||||
m_open = HGFALSE;
|
||||
m_dsmImpl->RemoveDS(this);
|
||||
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)
|
||||
{
|
||||
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)
|
||||
if (m_enable)
|
||||
{
|
||||
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);
|
||||
if (TWRC_SUCCESS != ret)
|
||||
{
|
||||
return HGBASE_ERR_FAIL;
|
||||
return HGTWAIN_ERR_FAIL;
|
||||
}
|
||||
|
||||
m_showUI = showUI;
|
||||
m_parent = parent;
|
||||
m_eventFunc = func;
|
||||
m_eventParam = param;
|
||||
m_eventFunc = eventFunc;
|
||||
m_eventParam = eventParam;
|
||||
m_imageFunc = NULL;
|
||||
m_imageParam = NULL;
|
||||
m_enable = HGTRUE;
|
||||
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;
|
||||
}
|
||||
|
@ -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);
|
||||
if (TWRC_SUCCESS != ret)
|
||||
{
|
||||
return HGBASE_ERR_FAIL;
|
||||
return HGTWAIN_ERR_FAIL;
|
||||
}
|
||||
|
||||
m_showUI = showUI;
|
||||
m_parent = parent;
|
||||
m_eventFunc = func;
|
||||
m_eventParam = param;
|
||||
m_eventFunc = eventFunc;
|
||||
m_eventParam = eventParam;
|
||||
m_imageFunc = imageFunc;
|
||||
m_imageParam = imageParam;
|
||||
m_enable = HGTRUE;
|
||||
return HGBASE_ERR_OK;
|
||||
}
|
||||
|
@ -499,10 +421,68 @@ HGResult HGTwainDSImpl::Disable()
|
|||
m_parent = NULL;
|
||||
m_eventFunc = NULL;
|
||||
m_eventParam = NULL;
|
||||
m_imageFunc = NULL;
|
||||
m_imageParam = NULL;
|
||||
m_enable = HGFALSE;
|
||||
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)
|
||||
{
|
||||
if (!m_enable)
|
||||
|
@ -518,13 +498,13 @@ HGResult HGTwainDSImpl::ImageNativeXfer(HGUInt type, HGUInt origin, HGImage* ima
|
|||
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))
|
||||
{
|
||||
return HGBASE_ERR_FAIL;
|
||||
return HGTWAIN_ERR_FAIL;
|
||||
}
|
||||
|
||||
HANDLE hMem = NULL;
|
||||
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);
|
||||
|
@ -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);
|
||||
if (TWRC_SUCCESS != ret)
|
||||
{
|
||||
return HGBASE_ERR_FAIL;
|
||||
return HGTWAIN_ERR_FAIL;
|
||||
}
|
||||
|
||||
*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);
|
||||
if (TWRC_SUCCESS != ret)
|
||||
{
|
||||
return HGBASE_ERR_FAIL;
|
||||
return HGTWAIN_ERR_FAIL;
|
||||
}
|
||||
|
||||
return HGBASE_ERR_OK;
|
||||
|
|
|
@ -14,16 +14,16 @@ public:
|
|||
HGTwainDSMImpl();
|
||||
~HGTwainDSMImpl();
|
||||
|
||||
HGResult LoadDSM();
|
||||
HGResult UnloadDSM();
|
||||
HGResult OpenDSM(HWND hwnd);
|
||||
HGResult CloseDSM();
|
||||
HGResult GetDSList(class HGTwainDSImpl** dsImpl, HGUInt* size);
|
||||
HGResult GetDefaultDS(class HGTwainDSImpl** dsImpl);
|
||||
HGResult SelectDS(class HGTwainDSImpl** dsImpl);
|
||||
HGResult Create(HWND hwnd);
|
||||
HGResult Destroy();
|
||||
HGResult GetDSCount(HGUInt* count);
|
||||
HGResult GetDSName(HGUInt index, HGChar* name, HGUInt maxLen);
|
||||
HGResult OpenDS(HGUInt index, class HGTwainDSImpl** dsImpl);
|
||||
HGResult OpenDefaultDS(class HGTwainDSImpl** dsImpl);
|
||||
HGResult OpenSelectedDS(class HGTwainDSImpl** dsImpl);
|
||||
|
||||
private:
|
||||
void GetIdentity();
|
||||
void RemoveDS(class HGTwainDSImpl* dsImpl);
|
||||
static LRESULT CALLBACK NewWndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam);
|
||||
|
||||
private:
|
||||
|
@ -33,26 +33,27 @@ private:
|
|||
HWND m_hWnd;
|
||||
static std::map<HWND, HGTwainDSMImpl*> m_mapWnd;
|
||||
WNDPROC m_oldWndProc;
|
||||
HGBool m_DSMOpen;
|
||||
std::vector<class HGTwainDSImpl *> m_vpDSImpl;
|
||||
std::vector<class HGTwainDSImpl *> m_listDSImpl;
|
||||
};
|
||||
|
||||
class HGTwainDSImpl
|
||||
{
|
||||
friend class HGTwainDSMImpl;
|
||||
public:
|
||||
HGTwainDSImpl(HGTwainDSMImpl* dsmImpl, const TW_IDENTITY *iden);
|
||||
HGTwainDSImpl(HGTwainDSMImpl* dsmImpl);
|
||||
~HGTwainDSImpl();
|
||||
|
||||
public:
|
||||
HGResult GetName(HGChar* name, HGUInt maxLen);
|
||||
HGResult Open();
|
||||
HGResult Open(const TW_IDENTITY* iden);
|
||||
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 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 EndXfer(HGUInt* count);
|
||||
HGResult Reset();
|
||||
|
@ -65,6 +66,8 @@ private:
|
|||
HWND m_parent;
|
||||
HGDSEventFunc m_eventFunc;
|
||||
HGPointer m_eventParam;
|
||||
HGDSImageFunc m_imageFunc;
|
||||
HGPointer m_imageParam;
|
||||
HGBool m_enable;
|
||||
};
|
||||
|
||||
|
|
Loading…
Reference in New Issue