2022-05-03 10:25:52 +00:00
|
|
|
|
#include "HGTwainImpl.hpp"
|
|
|
|
|
#include "../base/HGInc.h"
|
2023-03-25 10:03:47 +00:00
|
|
|
|
#include "../base/HGInfo.h"
|
2022-05-03 10:25:52 +00:00
|
|
|
|
|
2022-07-21 08:20:51 +00:00
|
|
|
|
std::map<HWND, HGTwainDSMImpl*> HGTwainDSMImpl::m_mapWnd;
|
2022-05-03 10:25:52 +00:00
|
|
|
|
|
|
|
|
|
HGTwainDSMImpl::HGTwainDSMImpl()
|
|
|
|
|
{
|
|
|
|
|
m_hDll = NULL;
|
|
|
|
|
m_pDSMProc = NULL;
|
|
|
|
|
GetIdentity();
|
|
|
|
|
m_hWnd = NULL;
|
2022-07-21 08:20:51 +00:00
|
|
|
|
m_oldWndProc = NULL;
|
2022-05-03 10:25:52 +00:00
|
|
|
|
m_DSMOpen = HGFALSE;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
HGTwainDSMImpl::~HGTwainDSMImpl()
|
|
|
|
|
{
|
2022-07-21 08:20:51 +00:00
|
|
|
|
UnloadDSM();
|
2022-05-03 10:25:52 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
HGResult HGTwainDSMImpl::LoadDSM()
|
|
|
|
|
{
|
|
|
|
|
if (NULL != m_pDSMProc)
|
|
|
|
|
{
|
|
|
|
|
return HGBASE_ERR_FAIL;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
assert(NULL == m_hDll);
|
|
|
|
|
HGBase_CreateDll("twain_32.dll", &m_hDll);
|
|
|
|
|
if (NULL == m_hDll)
|
|
|
|
|
{
|
|
|
|
|
return HGBASE_ERR_FAIL;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
HGBase_GetDllProcAddress(m_hDll, MAKEINTRESOURCEA(1), (HGPointer*)&m_pDSMProc);
|
|
|
|
|
if (NULL == m_pDSMProc)
|
|
|
|
|
{
|
|
|
|
|
HGBase_DestroyDll(m_hDll);
|
|
|
|
|
m_hDll = NULL;
|
|
|
|
|
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;
|
|
|
|
|
}
|
|
|
|
|
|
2023-03-25 10:03:47 +00:00
|
|
|
|
HGResult HGTwainDSMImpl::OpenDSM(HWND hwnd)
|
2022-05-03 10:25:52 +00:00
|
|
|
|
{
|
2023-03-25 10:03:47 +00:00
|
|
|
|
if (NULL == m_pDSMProc || m_DSMOpen)
|
2022-05-03 10:25:52 +00:00
|
|
|
|
{
|
|
|
|
|
return HGBASE_ERR_FAIL;
|
|
|
|
|
}
|
|
|
|
|
|
2023-03-25 10:03:47 +00:00
|
|
|
|
if (NULL == hwnd)
|
|
|
|
|
{
|
|
|
|
|
return HGBASE_ERR_INVALIDARG;
|
|
|
|
|
}
|
|
|
|
|
|
2022-07-21 08:20:51 +00:00
|
|
|
|
USHORT ret = m_pDSMProc(&m_AppId, NULL, DG_CONTROL, DAT_PARENT, MSG_OPENDSM, (TW_MEMREF)&hwnd);
|
2022-05-03 10:25:52 +00:00
|
|
|
|
if (TWRC_SUCCESS != ret)
|
|
|
|
|
{
|
|
|
|
|
return HGBASE_ERR_FAIL;
|
|
|
|
|
}
|
|
|
|
|
|
2022-07-21 08:20:51 +00:00
|
|
|
|
m_hWnd = hwnd;
|
|
|
|
|
m_mapWnd[m_hWnd] = this;
|
|
|
|
|
m_oldWndProc = (WNDPROC)SetWindowLongPtrW(m_hWnd, GWLP_WNDPROC, (LONG_PTR)NewWndProc);
|
2022-05-03 10:25:52 +00:00
|
|
|
|
m_DSMOpen = HGTRUE;
|
|
|
|
|
|
|
|
|
|
// 获取DS列表
|
|
|
|
|
TW_IDENTITY ds;
|
|
|
|
|
ret = m_pDSMProc(&m_AppId, NULL, DG_CONTROL, DAT_IDENTITY, MSG_GETFIRST, &ds);
|
|
|
|
|
if (TWRC_SUCCESS == ret)
|
|
|
|
|
{
|
2023-03-25 10:03:47 +00:00
|
|
|
|
HGTwainDSImpl* dsImpl = new HGTwainDSImpl(this, &ds);
|
|
|
|
|
m_vpDSImpl.push_back(dsImpl);
|
2022-05-03 10:25:52 +00:00
|
|
|
|
|
|
|
|
|
while (TWRC_SUCCESS == m_pDSMProc(&m_AppId, NULL, DG_CONTROL, DAT_IDENTITY, MSG_GETNEXT, &ds))
|
|
|
|
|
{
|
2023-03-25 10:03:47 +00:00
|
|
|
|
HGTwainDSImpl* dsImpl = new HGTwainDSImpl(this, &ds);
|
|
|
|
|
m_vpDSImpl.push_back(dsImpl);
|
2022-05-03 10:25:52 +00:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return HGBASE_ERR_OK;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
HGResult HGTwainDSMImpl::CloseDSM()
|
|
|
|
|
{
|
|
|
|
|
if (!m_DSMOpen)
|
|
|
|
|
{
|
|
|
|
|
return HGBASE_ERR_FAIL;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 先必须关闭DS
|
2023-03-25 10:03:47 +00:00
|
|
|
|
for (int i = 0; i < (int)m_vpDSImpl.size(); ++i)
|
2022-05-03 10:25:52 +00:00
|
|
|
|
{
|
2023-03-25 10:03:47 +00:00
|
|
|
|
m_vpDSImpl[i]->Close();
|
|
|
|
|
delete m_vpDSImpl[i];
|
2022-05-03 10:25:52 +00:00
|
|
|
|
}
|
2023-03-25 10:03:47 +00:00
|
|
|
|
m_vpDSImpl.clear();
|
2022-05-03 10:25:52 +00:00
|
|
|
|
|
|
|
|
|
m_pDSMProc(&m_AppId, NULL, DG_CONTROL, DAT_PARENT, MSG_CLOSEDSM, (TW_MEMREF)&m_hWnd);
|
2022-07-21 08:20:51 +00:00
|
|
|
|
SetWindowLongPtrW(m_hWnd, GWLP_WNDPROC, (LONG_PTR)m_oldWndProc);
|
|
|
|
|
m_oldWndProc = NULL;
|
|
|
|
|
std::map<HWND, HGTwainDSMImpl*>::iterator iter;
|
|
|
|
|
for (iter = m_mapWnd.begin(); iter != m_mapWnd.end(); ++iter)
|
|
|
|
|
{
|
|
|
|
|
if (iter->first == m_hWnd)
|
|
|
|
|
{
|
|
|
|
|
m_mapWnd.erase(iter);
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
2022-05-03 10:25:52 +00:00
|
|
|
|
m_hWnd = NULL;
|
|
|
|
|
m_DSMOpen = HGFALSE;
|
|
|
|
|
return HGBASE_ERR_OK;
|
|
|
|
|
}
|
|
|
|
|
|
2023-03-25 10:03:47 +00:00
|
|
|
|
HGResult HGTwainDSMImpl::GetDSList(class HGTwainDSImpl** dsImpl, HGUInt* size)
|
2022-05-03 10:25:52 +00:00
|
|
|
|
{
|
2023-03-25 10:03:47 +00:00
|
|
|
|
if (!m_DSMOpen)
|
2022-05-03 10:25:52 +00:00
|
|
|
|
{
|
2023-03-25 10:03:47 +00:00
|
|
|
|
return HGBASE_ERR_FAIL;
|
2022-05-03 10:25:52 +00:00
|
|
|
|
}
|
|
|
|
|
|
2023-03-25 10:03:47 +00:00
|
|
|
|
if (NULL == dsImpl || NULL == size || 0 == *size)
|
2022-05-03 10:25:52 +00:00
|
|
|
|
{
|
2023-03-25 10:03:47 +00:00
|
|
|
|
return HGBASE_ERR_INVALIDARG;
|
2022-05-03 10:25:52 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
HGUInt count = 0;
|
2023-03-25 10:03:47 +00:00
|
|
|
|
for (int i = 0; i < (int)m_vpDSImpl.size(); ++i)
|
2022-05-03 10:25:52 +00:00
|
|
|
|
{
|
2023-03-25 10:03:47 +00:00
|
|
|
|
dsImpl[i] = m_vpDSImpl[i];
|
2022-05-03 10:25:52 +00:00
|
|
|
|
++count;
|
|
|
|
|
|
|
|
|
|
if (count >= *size)
|
|
|
|
|
{
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
*size = count;
|
|
|
|
|
return HGBASE_ERR_OK;
|
|
|
|
|
}
|
|
|
|
|
|
2023-03-25 10:03:47 +00:00
|
|
|
|
HGResult HGTwainDSMImpl::GetDefaultDS(class HGTwainDSImpl** dsImpl)
|
2022-05-03 10:25:52 +00:00
|
|
|
|
{
|
2023-03-25 10:03:47 +00:00
|
|
|
|
if (!m_DSMOpen)
|
2022-05-03 10:25:52 +00:00
|
|
|
|
{
|
2023-03-25 10:03:47 +00:00
|
|
|
|
return HGBASE_ERR_FAIL;
|
2022-05-03 10:25:52 +00:00
|
|
|
|
}
|
|
|
|
|
|
2023-03-25 10:03:47 +00:00
|
|
|
|
if (NULL == dsImpl)
|
2022-05-03 10:25:52 +00:00
|
|
|
|
{
|
2023-03-25 10:03:47 +00:00
|
|
|
|
return HGBASE_ERR_INVALIDARG;
|
2022-05-03 10:25:52 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
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;
|
|
|
|
|
}
|
|
|
|
|
|
2023-03-25 10:03:47 +00:00
|
|
|
|
for (int i = 0; i < (int)m_vpDSImpl.size(); ++i)
|
2022-05-03 10:25:52 +00:00
|
|
|
|
{
|
2023-03-25 10:03:47 +00:00
|
|
|
|
if (0 == memcmp(&defDS, &m_vpDSImpl[i]->m_iden, sizeof(TW_IDENTITY)))
|
2022-05-03 10:25:52 +00:00
|
|
|
|
{
|
2023-03-25 10:03:47 +00:00
|
|
|
|
*dsImpl = m_vpDSImpl[i];
|
2022-05-03 10:25:52 +00:00
|
|
|
|
return HGBASE_ERR_OK;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return HGBASE_ERR_FAIL;
|
|
|
|
|
}
|
|
|
|
|
|
2023-03-25 10:03:47 +00:00
|
|
|
|
HGResult HGTwainDSMImpl::SelectDS(class HGTwainDSImpl** dsImpl)
|
2022-05-03 10:25:52 +00:00
|
|
|
|
{
|
2023-03-25 10:03:47 +00:00
|
|
|
|
if (!m_DSMOpen)
|
2022-05-03 10:25:52 +00:00
|
|
|
|
{
|
2023-03-25 10:03:47 +00:00
|
|
|
|
return HGBASE_ERR_FAIL;
|
2022-05-03 10:25:52 +00:00
|
|
|
|
}
|
|
|
|
|
|
2023-03-25 10:03:47 +00:00
|
|
|
|
if (NULL == dsImpl)
|
2022-05-03 10:25:52 +00:00
|
|
|
|
{
|
2023-03-25 10:03:47 +00:00
|
|
|
|
return HGBASE_ERR_INVALIDARG;
|
2022-05-03 10:25:52 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
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;
|
|
|
|
|
}
|
|
|
|
|
|
2023-03-25 10:03:47 +00:00
|
|
|
|
for (int i = 0; i < (int)m_vpDSImpl.size(); ++i)
|
2022-05-03 10:25:52 +00:00
|
|
|
|
{
|
2023-03-25 10:03:47 +00:00
|
|
|
|
if (0 == memcmp(&selectDS, &m_vpDSImpl[i]->m_iden, sizeof(TW_IDENTITY)))
|
2022-05-03 10:25:52 +00:00
|
|
|
|
{
|
2023-03-25 10:03:47 +00:00
|
|
|
|
*dsImpl = m_vpDSImpl[i];
|
2022-05-03 10:25:52 +00:00
|
|
|
|
return HGBASE_ERR_OK;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return HGBASE_ERR_FAIL;
|
|
|
|
|
}
|
|
|
|
|
|
2023-03-25 10:03:47 +00:00
|
|
|
|
void HGTwainDSMImpl::GetIdentity()
|
2022-05-03 10:25:52 +00:00
|
|
|
|
{
|
2023-03-25 10:03:47 +00:00
|
|
|
|
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");
|
|
|
|
|
}
|
2022-05-03 10:25:52 +00:00
|
|
|
|
|
2023-03-25 10:03:47 +00:00
|
|
|
|
LRESULT CALLBACK HGTwainDSMImpl::NewWndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
|
|
|
|
|
{
|
|
|
|
|
HGTwainDSMImpl* p = m_mapWnd[hWnd];
|
|
|
|
|
assert(NULL != p);
|
2022-05-03 10:25:52 +00:00
|
|
|
|
|
2023-03-25 10:03:47 +00:00
|
|
|
|
MSG msg2 = { 0 };
|
|
|
|
|
msg2.hwnd = hWnd;
|
|
|
|
|
msg2.message = msg;
|
|
|
|
|
msg2.wParam = wParam;
|
|
|
|
|
msg2.lParam = lParam;
|
|
|
|
|
|
|
|
|
|
for (int i = 0; i < (int)p->m_vpDSImpl.size(); ++i)
|
2022-05-03 10:25:52 +00:00
|
|
|
|
{
|
2023-03-25 10:03:47 +00:00
|
|
|
|
if (p->m_vpDSImpl[i]->m_enable)
|
2022-05-03 10:25:52 +00:00
|
|
|
|
{
|
2023-03-25 10:03:47 +00:00
|
|
|
|
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,
|
|
|
|
|
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;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
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);
|
|
|
|
|
}
|
2022-05-03 10:25:52 +00:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2023-03-25 10:03:47 +00:00
|
|
|
|
return CallWindowProcW(p->m_oldWndProc, hWnd, msg, wParam, lParam);
|
2022-05-03 10:25:52 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2023-03-25 10:03:47 +00:00
|
|
|
|
HGTwainDSImpl::HGTwainDSImpl(HGTwainDSMImpl* dsmImpl, const TW_IDENTITY* iden)
|
|
|
|
|
{
|
|
|
|
|
m_dsmImpl = dsmImpl;
|
|
|
|
|
memcpy(&m_iden, iden, sizeof(TW_IDENTITY));
|
|
|
|
|
m_open = HGFALSE;
|
|
|
|
|
m_showUI = HGFALSE;
|
|
|
|
|
m_parent = NULL;
|
|
|
|
|
m_eventFunc = NULL;
|
|
|
|
|
m_eventParam = NULL;
|
|
|
|
|
m_enable = HGFALSE;
|
|
|
|
|
}
|
2022-05-03 10:25:52 +00:00
|
|
|
|
|
2023-03-25 10:03:47 +00:00
|
|
|
|
HGTwainDSImpl::~HGTwainDSImpl()
|
|
|
|
|
{
|
2022-05-03 10:25:52 +00:00
|
|
|
|
|
2023-03-25 10:03:47 +00:00
|
|
|
|
}
|
2022-05-03 10:25:52 +00:00
|
|
|
|
|
2023-03-25 10:03:47 +00:00
|
|
|
|
HGResult HGTwainDSImpl::GetName(HGChar* name, HGUInt maxLen)
|
|
|
|
|
{
|
|
|
|
|
strcpy_s(name, maxLen, m_iden.ProductName);
|
|
|
|
|
return HGBASE_ERR_OK;
|
2022-05-03 10:25:52 +00:00
|
|
|
|
}
|
|
|
|
|
|
2023-03-25 10:03:47 +00:00
|
|
|
|
HGResult HGTwainDSImpl::Open()
|
2022-05-03 10:25:52 +00:00
|
|
|
|
{
|
2023-03-25 10:03:47 +00:00
|
|
|
|
if (m_open)
|
2022-05-03 10:25:52 +00:00
|
|
|
|
{
|
2023-03-25 10:03:47 +00:00
|
|
|
|
return HGBASE_ERR_FAIL;
|
2022-05-03 10:25:52 +00:00
|
|
|
|
}
|
|
|
|
|
|
2023-03-25 10:03:47 +00:00
|
|
|
|
USHORT ret = m_dsmImpl->m_pDSMProc(&m_dsmImpl->m_AppId, NULL, DG_CONTROL, DAT_IDENTITY, MSG_OPENDS, &m_iden);
|
|
|
|
|
if (TWRC_SUCCESS != ret)
|
2022-05-03 10:25:52 +00:00
|
|
|
|
{
|
2023-03-25 10:03:47 +00:00
|
|
|
|
return HGBASE_ERR_FAIL;
|
2022-05-03 10:25:52 +00:00
|
|
|
|
}
|
|
|
|
|
|
2023-03-25 10:03:47 +00:00
|
|
|
|
m_open = HGTRUE;
|
|
|
|
|
return HGBASE_ERR_OK;
|
2022-05-03 10:25:52 +00:00
|
|
|
|
}
|
|
|
|
|
|
2023-03-25 10:03:47 +00:00
|
|
|
|
HGResult HGTwainDSImpl::Close()
|
2022-05-03 10:25:52 +00:00
|
|
|
|
{
|
2023-03-25 10:03:47 +00:00
|
|
|
|
if (!m_open)
|
2022-05-03 10:25:52 +00:00
|
|
|
|
{
|
2023-03-25 10:03:47 +00:00
|
|
|
|
return HGBASE_ERR_FAIL;
|
2022-05-03 10:25:52 +00:00
|
|
|
|
}
|
|
|
|
|
|
2023-03-25 10:03:47 +00:00
|
|
|
|
Disable();
|
|
|
|
|
m_dsmImpl->m_pDSMProc(&m_dsmImpl->m_AppId, NULL, DG_CONTROL, DAT_IDENTITY, MSG_CLOSEDS, (TW_MEMREF)&m_iden);
|
2022-05-03 10:25:52 +00:00
|
|
|
|
|
2023-03-25 10:03:47 +00:00
|
|
|
|
m_open = HGFALSE;
|
|
|
|
|
return HGBASE_ERR_OK;
|
2022-05-03 10:25:52 +00:00
|
|
|
|
}
|
|
|
|
|
|
2023-03-25 10:03:47 +00:00
|
|
|
|
HGResult HGTwainDSImpl::SetCap(HGUInt cap, HGInt value)
|
2022-05-03 10:25:52 +00:00
|
|
|
|
{
|
2023-03-25 10:03:47 +00:00
|
|
|
|
if (!m_open)
|
2022-05-03 10:25:52 +00:00
|
|
|
|
{
|
2023-03-25 10:03:47 +00:00
|
|
|
|
return HGBASE_ERR_FAIL;
|
2022-05-03 10:25:52 +00:00
|
|
|
|
}
|
|
|
|
|
|
2023-03-25 10:03:47 +00:00
|
|
|
|
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)
|
2022-05-03 10:25:52 +00:00
|
|
|
|
{
|
2023-03-25 10:03:47 +00:00
|
|
|
|
return HGBASE_ERR_FAIL;
|
|
|
|
|
}
|
2022-05-03 10:25:52 +00:00
|
|
|
|
|
2023-03-25 10:03:47 +00:00
|
|
|
|
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;
|
|
|
|
|
}
|
2022-05-03 10:25:52 +00:00
|
|
|
|
|
2023-03-25 10:03:47 +00:00
|
|
|
|
pTW_ONEVALUE pVal = (pTW_ONEVALUE)GlobalLock(twCap.hContainer);
|
|
|
|
|
assert(NULL != pVal);
|
|
|
|
|
pVal->ItemType = TWTY_INT32;
|
|
|
|
|
pVal->Item = (TW_UINT32)value;
|
|
|
|
|
GlobalUnlock(twCap.hContainer);
|
2022-05-03 10:25:52 +00:00
|
|
|
|
|
2023-03-25 10:03:47 +00:00
|
|
|
|
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;
|
2022-05-03 10:25:52 +00:00
|
|
|
|
}
|
|
|
|
|
|
2023-03-25 10:03:47 +00:00
|
|
|
|
GlobalFree(twCap.hContainer);
|
|
|
|
|
return HGBASE_ERR_OK;
|
2022-05-03 10:25:52 +00:00
|
|
|
|
}
|
|
|
|
|
|
2023-03-25 10:03:47 +00:00
|
|
|
|
HGResult HGTwainDSImpl::GetCap(HGUInt cap, HGInt* value)
|
2022-05-03 10:25:52 +00:00
|
|
|
|
{
|
2023-03-25 10:03:47 +00:00
|
|
|
|
if (!m_open)
|
|
|
|
|
{
|
|
|
|
|
return HGBASE_ERR_FAIL;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (NULL == value)
|
2022-05-03 10:25:52 +00:00
|
|
|
|
{
|
|
|
|
|
return HGBASE_ERR_INVALIDARG;
|
|
|
|
|
}
|
|
|
|
|
|
2023-03-25 10:03:47 +00:00
|
|
|
|
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)
|
2022-05-03 10:25:52 +00:00
|
|
|
|
{
|
2023-03-25 10:03:47 +00:00
|
|
|
|
return HGBASE_ERR_FAIL;
|
|
|
|
|
}
|
2022-05-03 10:25:52 +00:00
|
|
|
|
|
2023-03-25 10:03:47 +00:00
|
|
|
|
TW_CAPABILITY twCap;
|
|
|
|
|
twCap.Cap = (TW_UINT16)cap2;
|
|
|
|
|
twCap.ConType = TWON_ONEVALUE;
|
|
|
|
|
twCap.hContainer = NULL;
|
2022-05-03 10:25:52 +00:00
|
|
|
|
|
2023-03-25 10:03:47 +00:00
|
|
|
|
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;
|
2022-05-03 10:25:52 +00:00
|
|
|
|
}
|
|
|
|
|
|
2023-03-25 10:03:47 +00:00
|
|
|
|
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;
|
2022-05-03 10:25:52 +00:00
|
|
|
|
}
|
|
|
|
|
|
2023-03-25 10:03:47 +00:00
|
|
|
|
HGResult HGTwainDSImpl::EnableUIOnly(HGBool showUI, HWND parent, HGDSEventFunc func, HGPointer param)
|
2022-05-03 10:25:52 +00:00
|
|
|
|
{
|
2023-03-25 10:03:47 +00:00
|
|
|
|
if (!m_open || m_enable)
|
2022-05-03 10:25:52 +00:00
|
|
|
|
{
|
2023-03-25 10:03:47 +00:00
|
|
|
|
return HGBASE_ERR_FAIL;
|
2022-05-03 10:25:52 +00:00
|
|
|
|
}
|
|
|
|
|
|
2023-03-25 10:03:47 +00:00
|
|
|
|
TW_USERINTERFACE twUI;
|
|
|
|
|
twUI.ShowUI = (TW_BOOL)showUI;
|
|
|
|
|
twUI.hParent = (TW_HANDLE)parent;
|
|
|
|
|
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)
|
2022-05-03 10:25:52 +00:00
|
|
|
|
{
|
2023-03-25 10:03:47 +00:00
|
|
|
|
return HGBASE_ERR_FAIL;
|
2022-05-03 10:25:52 +00:00
|
|
|
|
}
|
|
|
|
|
|
2023-03-25 10:03:47 +00:00
|
|
|
|
m_showUI = showUI;
|
|
|
|
|
m_parent = parent;
|
|
|
|
|
m_eventFunc = func;
|
|
|
|
|
m_eventParam = param;
|
|
|
|
|
m_enable = HGTRUE;
|
|
|
|
|
return HGBASE_ERR_OK;
|
2022-05-03 10:25:52 +00:00
|
|
|
|
}
|
|
|
|
|
|
2023-03-25 10:03:47 +00:00
|
|
|
|
HGResult HGTwainDSImpl::Enable(HGBool showUI, HWND parent, HGDSEventFunc func, HGPointer param)
|
2022-05-03 10:25:52 +00:00
|
|
|
|
{
|
2023-03-25 10:03:47 +00:00
|
|
|
|
if (!m_open || m_enable)
|
2022-05-03 10:25:52 +00:00
|
|
|
|
{
|
2023-03-25 10:03:47 +00:00
|
|
|
|
return HGBASE_ERR_FAIL;
|
2022-05-03 10:25:52 +00:00
|
|
|
|
}
|
|
|
|
|
|
2023-03-25 10:03:47 +00:00
|
|
|
|
TW_USERINTERFACE twUI;
|
|
|
|
|
twUI.ShowUI = (TW_BOOL)showUI;
|
|
|
|
|
twUI.hParent = (TW_HANDLE)parent;
|
|
|
|
|
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)
|
2022-05-03 10:25:52 +00:00
|
|
|
|
{
|
2023-03-25 10:03:47 +00:00
|
|
|
|
return HGBASE_ERR_FAIL;
|
2022-05-03 10:25:52 +00:00
|
|
|
|
}
|
|
|
|
|
|
2023-03-25 10:03:47 +00:00
|
|
|
|
m_showUI = showUI;
|
|
|
|
|
m_parent = parent;
|
|
|
|
|
m_eventFunc = func;
|
|
|
|
|
m_eventParam = param;
|
|
|
|
|
m_enable = HGTRUE;
|
|
|
|
|
return HGBASE_ERR_OK;
|
2022-05-03 10:25:52 +00:00
|
|
|
|
}
|
|
|
|
|
|
2023-03-25 10:03:47 +00:00
|
|
|
|
HGResult HGTwainDSImpl::Disable()
|
2022-05-03 10:25:52 +00:00
|
|
|
|
{
|
2023-03-25 10:03:47 +00:00
|
|
|
|
if (!m_enable)
|
2022-05-03 10:25:52 +00:00
|
|
|
|
{
|
2023-03-25 10:03:47 +00:00
|
|
|
|
return HGBASE_ERR_FAIL;
|
2022-05-03 10:25:52 +00:00
|
|
|
|
}
|
|
|
|
|
|
2023-03-25 10:03:47 +00:00
|
|
|
|
TW_USERINTERFACE twUI;
|
|
|
|
|
twUI.ShowUI = (TW_BOOL)m_showUI;
|
|
|
|
|
twUI.hParent = (TW_HANDLE)m_parent;
|
|
|
|
|
m_dsmImpl->m_pDSMProc(&m_dsmImpl->m_AppId, &m_iden, DG_CONTROL, DAT_USERINTERFACE, MSG_DISABLEDS, &twUI);
|
2022-05-03 10:25:52 +00:00
|
|
|
|
|
2023-03-25 10:03:47 +00:00
|
|
|
|
m_showUI = HGFALSE;
|
|
|
|
|
m_parent = NULL;
|
|
|
|
|
m_eventFunc = NULL;
|
|
|
|
|
m_eventParam = NULL;
|
|
|
|
|
m_enable = HGFALSE;
|
|
|
|
|
return HGBASE_ERR_OK;
|
2022-05-03 10:25:52 +00:00
|
|
|
|
}
|
|
|
|
|
|
2023-03-25 10:03:47 +00:00
|
|
|
|
HGResult HGTwainDSImpl::ImageNativeXfer(HGUInt type, HGUInt origin, HGImage* image)
|
2022-05-03 10:25:52 +00:00
|
|
|
|
{
|
2023-03-25 10:03:47 +00:00
|
|
|
|
if (!m_enable)
|
2022-05-03 10:25:52 +00:00
|
|
|
|
{
|
2023-03-25 10:03:47 +00:00
|
|
|
|
return HGBASE_ERR_FAIL;
|
2022-05-03 10:25:52 +00:00
|
|
|
|
}
|
|
|
|
|
|
2023-03-25 10:03:47 +00:00
|
|
|
|
if (NULL == image)
|
2022-05-03 10:25:52 +00:00
|
|
|
|
{
|
2023-03-25 10:03:47 +00:00
|
|
|
|
return HGBASE_ERR_INVALIDARG;
|
|
|
|
|
}
|
2022-05-03 10:25:52 +00:00
|
|
|
|
|
2023-03-25 10:03:47 +00:00
|
|
|
|
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;
|
|
|
|
|
}
|
2022-05-03 10:25:52 +00:00
|
|
|
|
|
2023-03-25 10:03:47 +00:00
|
|
|
|
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;
|
2022-05-03 10:25:52 +00:00
|
|
|
|
}
|
|
|
|
|
|
2023-03-25 10:03:47 +00:00
|
|
|
|
HGResult ret = HGBase_CreateImageFromDIB(hMem, NULL, type, origin, image);
|
|
|
|
|
GlobalFree(hMem);
|
|
|
|
|
return ret;
|
2022-05-03 10:25:52 +00:00
|
|
|
|
}
|
|
|
|
|
|
2023-03-25 10:03:47 +00:00
|
|
|
|
HGResult HGTwainDSImpl::EndXfer(HGUInt* count)
|
2022-05-03 10:25:52 +00:00
|
|
|
|
{
|
2023-03-25 10:03:47 +00:00
|
|
|
|
if (!m_enable)
|
2022-05-03 10:25:52 +00:00
|
|
|
|
{
|
2023-03-25 10:03:47 +00:00
|
|
|
|
return HGBASE_ERR_FAIL;
|
2022-05-03 10:25:52 +00:00
|
|
|
|
}
|
|
|
|
|
|
2023-03-25 10:03:47 +00:00
|
|
|
|
if (NULL == count)
|
2022-05-03 10:25:52 +00:00
|
|
|
|
{
|
2023-03-25 10:03:47 +00:00
|
|
|
|
return HGBASE_ERR_INVALIDARG;
|
2022-05-03 10:25:52 +00:00
|
|
|
|
}
|
|
|
|
|
|
2023-03-25 10:03:47 +00:00
|
|
|
|
TW_PENDINGXFERS 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)
|
|
|
|
|
{
|
|
|
|
|
return HGBASE_ERR_FAIL;
|
|
|
|
|
}
|
2022-05-03 10:25:52 +00:00
|
|
|
|
|
2023-03-25 10:03:47 +00:00
|
|
|
|
*count = twPend.Count;
|
|
|
|
|
return HGBASE_ERR_OK;
|
2022-05-03 10:25:52 +00:00
|
|
|
|
}
|
|
|
|
|
|
2023-03-25 10:03:47 +00:00
|
|
|
|
HGResult HGTwainDSImpl::Reset()
|
2022-05-03 10:25:52 +00:00
|
|
|
|
{
|
2023-03-25 10:03:47 +00:00
|
|
|
|
if (!m_enable)
|
|
|
|
|
{
|
|
|
|
|
return HGBASE_ERR_FAIL;
|
|
|
|
|
}
|
2022-07-21 08:20:51 +00:00
|
|
|
|
|
2023-03-25 10:03:47 +00:00
|
|
|
|
TW_PENDINGXFERS 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)
|
2022-07-21 08:20:51 +00:00
|
|
|
|
{
|
2023-03-25 10:03:47 +00:00
|
|
|
|
return HGBASE_ERR_FAIL;
|
2022-05-03 10:25:52 +00:00
|
|
|
|
}
|
|
|
|
|
|
2023-03-25 10:03:47 +00:00
|
|
|
|
return HGBASE_ERR_OK;
|
2022-05-03 10:25:52 +00:00
|
|
|
|
}
|