twain_user类关系调整
This commit is contained in:
parent
ed7e7638ff
commit
42d3ef90ee
|
@ -130,7 +130,7 @@ BOOL CHGTestDlg::OnInitDialog()
|
||||||
HGSane_CreateManager("sane.dll", &m_saneMgr);
|
HGSane_CreateManager("sane.dll", &m_saneMgr);
|
||||||
#else
|
#else
|
||||||
HGTwain_LoadDSM(&m_dsm);
|
HGTwain_LoadDSM(&m_dsm);
|
||||||
HGTwain_OpenDSM(m_dsm, m_hWnd, DSEventCallback, this);
|
HGTwain_OpenDSM(m_dsm, m_hWnd);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
return TRUE; // 除非将焦点设置到控件,否则返回 TRUE
|
return TRUE; // 除非将焦点设置到控件,否则返回 TRUE
|
||||||
|
@ -195,7 +195,7 @@ void CHGTestDlg::OnBnClickedButton1()
|
||||||
|
|
||||||
HGChar errInfo[256];
|
HGChar errInfo[256];
|
||||||
HGSane_OpenDevice(m_saneMgr, 0, &m_saneDev, errInfo, 256);
|
HGSane_OpenDevice(m_saneMgr, 0, &m_saneDev, errInfo, 256);
|
||||||
HGResult ret = HGSane_StartDevice(m_saneDev, SaneDeviceEventCallback, this, SaneDeviceImageCallback, this, errInfo, 256);
|
HGResult ret = HGSane_StartDevice(m_saneDev, DeviceEventCallback, this, DeviceImageCallback, this, errInfo, 256);
|
||||||
if (HGBASE_ERR_OK != ret)
|
if (HGBASE_ERR_OK != ret)
|
||||||
{
|
{
|
||||||
HGSane_CloseDevice(m_saneDev);
|
HGSane_CloseDevice(m_saneDev);
|
||||||
|
@ -211,7 +211,7 @@ void CHGTestDlg::OnBnClickedButton1()
|
||||||
if (NULL != m_ds)
|
if (NULL != m_ds)
|
||||||
{
|
{
|
||||||
HGTwain_OpenDS(m_ds);
|
HGTwain_OpenDS(m_ds);
|
||||||
HGTwain_EnableDS(m_ds, HGTRUE, NULL);
|
HGTwain_EnableDS(m_ds, HGTRUE, m_hWnd, DSEventCallback, this);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
@ -229,12 +229,12 @@ void CHGTestDlg::OnBnClickedButton2()
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef USE_SANE
|
#ifdef USE_SANE
|
||||||
void HGAPI CHGTestDlg::SaneDeviceEventCallback(HGSaneDevice dev, HGUInt error, const HGChar* errInfo, HGPointer param)
|
void HGAPI CHGTestDlg::DeviceEventCallback(HGSaneDevice dev, HGUInt error, const HGChar* errInfo, HGPointer param)
|
||||||
{
|
{
|
||||||
CHGTestDlg* p = (CHGTestDlg*)param;
|
CHGTestDlg* p = (CHGTestDlg*)param;
|
||||||
::PostMessage(p->m_hWnd, 2000, 0, 0);
|
::PostMessage(p->m_hWnd, 2000, 0, 0);
|
||||||
}
|
}
|
||||||
void HGAPI CHGTestDlg::SaneDeviceImageCallback(HGSaneDevice dev, HGImage image, HGPointer param)
|
void HGAPI CHGTestDlg::DeviceImageCallback(HGSaneDevice dev, HGImage image, HGPointer param)
|
||||||
{
|
{
|
||||||
CHGTestDlg* p = (CHGTestDlg*)param;
|
CHGTestDlg* p = (CHGTestDlg*)param;
|
||||||
|
|
||||||
|
@ -248,29 +248,21 @@ void CHGTestDlg::DSEventCallback(HGTwainDS ds, HGUInt event, HGPointer param)
|
||||||
CHGTestDlg* p = (CHGTestDlg*)param;
|
CHGTestDlg* p = (CHGTestDlg*)param;
|
||||||
if (HGTWAIN_DSEVENT_XFERREADY == event)
|
if (HGTWAIN_DSEVENT_XFERREADY == event)
|
||||||
{
|
{
|
||||||
ULONG idx = 0;
|
while (1)
|
||||||
|
{
|
||||||
HGImage image = NULL;
|
HGImage image = NULL;
|
||||||
HGTwain_ImageNativeXfer(p->m_ds, 0, HGBASE_IMGORIGIN_TOP, &image);
|
HGTwain_ImageNativeXfer(p->m_ds, 0, 0, &image);
|
||||||
CStringA strName;
|
CStringA strName;
|
||||||
strName.Format("D:\\Twain_%u.bmp", 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);
|
HGBase_DestroyImage(image);
|
||||||
|
|
||||||
HGUInt count = 0;
|
HGUInt count = 0;
|
||||||
HGTwain_EndXfer(p->m_ds, &count);
|
HGTwain_EndXfer(p->m_ds, &count);
|
||||||
while (count != 0)
|
if (0 == count)
|
||||||
{
|
{
|
||||||
++idx;
|
break;
|
||||||
|
}
|
||||||
HGImage image = NULL;
|
|
||||||
HGTwain_ImageNativeXfer(p->m_ds, 0, HGBASE_IMGORIGIN_TOP, &image);
|
|
||||||
CStringA strName;
|
|
||||||
strName.Format("D:\\Twain_%u.bmp", idx);
|
|
||||||
HGImgFmt_SaveImage(image, 0, NULL, strName);
|
|
||||||
HGBase_DestroyImage(image);
|
|
||||||
|
|
||||||
HGTwain_EndXfer(p->m_ds, &count);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
HGTwain_Reset(p->m_ds);
|
HGTwain_Reset(p->m_ds);
|
||||||
|
|
|
@ -25,8 +25,8 @@ protected:
|
||||||
#ifdef USE_SANE
|
#ifdef USE_SANE
|
||||||
HGSaneManager m_saneMgr;
|
HGSaneManager m_saneMgr;
|
||||||
HGSaneDevice m_saneDev;
|
HGSaneDevice m_saneDev;
|
||||||
static void HGAPI SaneDeviceEventCallback(HGSaneDevice dev, HGUInt error, const HGChar* errInfo, HGPointer param);
|
static void HGAPI DeviceEventCallback(HGSaneDevice dev, HGUInt error, const HGChar* errInfo, HGPointer param);
|
||||||
static void HGAPI SaneDeviceImageCallback(HGSaneDevice dev, HGImage image, HGPointer param);
|
static void HGAPI DeviceImageCallback(HGSaneDevice dev, HGImage image, HGPointer param);
|
||||||
#else
|
#else
|
||||||
HGTwainDSM m_dsm;
|
HGTwainDSM m_dsm;
|
||||||
HGTwainDS m_ds;
|
HGTwainDS m_ds;
|
||||||
|
|
|
@ -511,6 +511,11 @@ static HGResult LoadGdiImage(Gdiplus::Image* pImage, const HGImageRoi* roi, HGUI
|
||||||
type = GetType(pImage);
|
type = GetType(pImage);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (0 == origin)
|
||||||
|
{
|
||||||
|
origin = HGBASE_IMGORIGIN_TOP;
|
||||||
|
}
|
||||||
|
|
||||||
HGResult ret = HGBase_CreateImage(roi2.right - roi2.left, roi2.bottom - roi2.top, type, origin, image);
|
HGResult ret = HGBase_CreateImage(roi2.right - roi2.left, roi2.bottom - roi2.top, type, origin, image);
|
||||||
if (HGBASE_ERR_OK != ret)
|
if (HGBASE_ERR_OK != ret)
|
||||||
{
|
{
|
||||||
|
@ -598,15 +603,17 @@ HGResult HGAPI HGBase_CreateImageFromDIB(HGLOBAL hMem, const HGImageRoi* roi,
|
||||||
Gdiplus::GdiplusStartup(&nToken, &input, &output);
|
Gdiplus::GdiplusStartup(&nToken, &input, &output);
|
||||||
assert(0 != nToken);
|
assert(0 != nToken);
|
||||||
|
|
||||||
Gdiplus::Image img(pStream);
|
Gdiplus::Image *img = new Gdiplus::Image(pStream);
|
||||||
Gdiplus::Status status = img.GetLastStatus();
|
Gdiplus::Status status = img->GetLastStatus();
|
||||||
if (Gdiplus::Ok == status)
|
if (Gdiplus::Ok == status)
|
||||||
{
|
{
|
||||||
ret = LoadGdiImage(&img, roi, type, origin, image);
|
ret = LoadGdiImage(img, roi, type, origin, image);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
delete img;
|
||||||
Gdiplus::GdiplusShutdown(nToken);
|
Gdiplus::GdiplusShutdown(nToken);
|
||||||
nToken = 0;
|
nToken = 0;
|
||||||
|
|
||||||
pStream->Release();
|
pStream->Release();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -101,8 +101,8 @@ HGResult HGAPI HGSane_GetDeviceHandle(HGSaneDevice dev, SANE_Handle* handle)
|
||||||
return saneDeviceImpl->GetHandle(handle);
|
return saneDeviceImpl->GetHandle(handle);
|
||||||
}
|
}
|
||||||
|
|
||||||
HGResult HGAPI HGSane_StartDevice(HGSaneDevice dev, HGSane_DeviceEventCallback eventFunc, HGPointer eventParam,
|
HGResult HGAPI HGSane_StartDevice(HGSaneDevice dev, HGSane_DeviceEventFunc eventFunc, HGPointer eventParam,
|
||||||
HGSane_DeviceImageCallback imageFunc, HGPointer imageParam, HGChar* errInfo, HGUInt errInfoLen)
|
HGSane_DeviceImageFunc imageFunc, HGPointer imageParam, HGChar* errInfo, HGUInt errInfoLen)
|
||||||
{
|
{
|
||||||
if (NULL == dev)
|
if (NULL == dev)
|
||||||
{
|
{
|
||||||
|
|
|
@ -12,8 +12,8 @@ HG_DECLARE_HANDLE(HGSaneDevice);
|
||||||
|
|
||||||
/* Sane设备回调
|
/* Sane设备回调
|
||||||
*/
|
*/
|
||||||
typedef void (HGAPI* HGSane_DeviceEventCallback)(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_DeviceImageCallback)(HGSaneDevice dev, HGImage image, HGPointer param);
|
typedef void (HGAPI* HGSane_DeviceImageFunc)(HGSaneDevice dev, HGImage image, HGPointer param);
|
||||||
|
|
||||||
HGEXPORT HGResult HGAPI HGSane_CreateManager(const HGChar *sanePath, HGSaneManager* mgr);
|
HGEXPORT HGResult HGAPI HGSane_CreateManager(const HGChar *sanePath, HGSaneManager* mgr);
|
||||||
|
|
||||||
|
@ -29,8 +29,8 @@ HGEXPORT HGResult HGAPI HGSane_CloseDevice(HGSaneDevice dev);
|
||||||
|
|
||||||
HGEXPORT HGResult HGAPI HGSane_GetDeviceHandle(HGSaneDevice dev, SANE_Handle *handle);
|
HGEXPORT HGResult HGAPI HGSane_GetDeviceHandle(HGSaneDevice dev, SANE_Handle *handle);
|
||||||
|
|
||||||
HGEXPORT HGResult HGAPI HGSane_StartDevice(HGSaneDevice dev, HGSane_DeviceEventCallback eventFunc, HGPointer eventParam,
|
HGEXPORT HGResult HGAPI HGSane_StartDevice(HGSaneDevice dev, HGSane_DeviceEventFunc eventFunc, HGPointer eventParam,
|
||||||
HGSane_DeviceImageCallback imageFunc, HGPointer imageParam, HGChar* errInfo, HGUInt errInfoLen);
|
HGSane_DeviceImageFunc imageFunc, HGPointer imageParam, HGChar* errInfo, HGUInt errInfoLen);
|
||||||
|
|
||||||
HGEXPORT HGResult HGAPI HGSane_StopDevice(HGSaneDevice dev);
|
HGEXPORT HGResult HGAPI HGSane_StopDevice(HGSaneDevice dev);
|
||||||
|
|
||||||
|
|
|
@ -234,9 +234,9 @@ void HGSaneManagerImpl::RemoveDevice(class HGSaneDeviceImpl* deviceImpl)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
HGSaneDeviceImpl::HGSaneDeviceImpl(HGSaneManagerImpl* mgr)
|
HGSaneDeviceImpl::HGSaneDeviceImpl(HGSaneManagerImpl* mgrImpl)
|
||||||
{
|
{
|
||||||
m_mgrImpl = mgr;
|
m_mgrImpl = mgrImpl;
|
||||||
m_devHandle = NULL;
|
m_devHandle = NULL;
|
||||||
m_buffer = NULL;
|
m_buffer = NULL;
|
||||||
m_bufferSize = 0;
|
m_bufferSize = 0;
|
||||||
|
@ -312,8 +312,8 @@ HGResult HGSaneDeviceImpl::GetHandle(SANE_Handle* handle)
|
||||||
return HGBASE_ERR_OK;
|
return HGBASE_ERR_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
HGResult HGSaneDeviceImpl::Start(HGSane_DeviceEventCallback eventFunc, HGPointer eventParam,
|
HGResult HGSaneDeviceImpl::Start(HGSane_DeviceEventFunc eventFunc, HGPointer eventParam,
|
||||||
HGSane_DeviceImageCallback imageFunc, HGPointer imageParam, HGChar* errInfo, HGUInt errInfoLen)
|
HGSane_DeviceImageFunc imageFunc, HGPointer imageParam, HGChar* errInfo, HGUInt errInfoLen)
|
||||||
{
|
{
|
||||||
if (NULL != m_thread)
|
if (NULL != m_thread)
|
||||||
{
|
{
|
||||||
|
|
|
@ -63,14 +63,14 @@ private:
|
||||||
class HGSaneDeviceImpl
|
class HGSaneDeviceImpl
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
HGSaneDeviceImpl(HGSaneManagerImpl* mgr);
|
HGSaneDeviceImpl(HGSaneManagerImpl* mgrImpl);
|
||||||
~HGSaneDeviceImpl();
|
~HGSaneDeviceImpl();
|
||||||
|
|
||||||
HGResult Open(const HGChar *devName, HGChar* errInfo, HGUInt errInfoLen);
|
HGResult Open(const HGChar *devName, HGChar* errInfo, HGUInt errInfoLen);
|
||||||
HGResult Close();
|
HGResult Close();
|
||||||
HGResult GetHandle(SANE_Handle* handle);
|
HGResult GetHandle(SANE_Handle* handle);
|
||||||
HGResult Start(HGSane_DeviceEventCallback eventFunc, HGPointer eventParam,
|
HGResult Start(HGSane_DeviceEventFunc eventFunc, HGPointer eventParam,
|
||||||
HGSane_DeviceImageCallback imageFunc, HGPointer imageParam, HGChar* errInfo, HGUInt errInfoLen);
|
HGSane_DeviceImageFunc imageFunc, HGPointer imageParam, HGChar* errInfo, HGUInt errInfoLen);
|
||||||
HGResult Stop();
|
HGResult Stop();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
@ -78,14 +78,14 @@ private:
|
||||||
static void HGAPI ThreadFunc(HGThread thread, HGPointer param);
|
static void HGAPI ThreadFunc(HGThread thread, HGPointer param);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
class HGSaneManagerImpl* m_mgrImpl;
|
HGSaneManagerImpl* m_mgrImpl;
|
||||||
SANE_Handle m_devHandle;
|
SANE_Handle m_devHandle;
|
||||||
HGByte* m_buffer;
|
HGByte* m_buffer;
|
||||||
HGInt m_bufferSize;
|
HGInt m_bufferSize;
|
||||||
HGUInt m_dpi;
|
HGUInt m_dpi;
|
||||||
HGSane_DeviceEventCallback m_eventFunc;
|
HGSane_DeviceEventFunc m_eventFunc;
|
||||||
HGPointer m_eventParam;
|
HGPointer m_eventParam;
|
||||||
HGSane_DeviceImageCallback m_imageFunc;
|
HGSane_DeviceImageFunc m_imageFunc;
|
||||||
HGPointer m_imageParam;
|
HGPointer m_imageParam;
|
||||||
volatile HGBool m_stopThread;
|
volatile HGBool m_stopThread;
|
||||||
HGThread m_thread;
|
HGThread m_thread;
|
||||||
|
|
|
@ -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, HGDSEventFunc func, HGPointer param)
|
HGResult HGAPI HGTwain_OpenDSM(HGTwainDSM dsm, HWND hwnd)
|
||||||
{
|
{
|
||||||
if (NULL == dsm)
|
if (NULL == dsm)
|
||||||
{
|
{
|
||||||
|
@ -46,7 +46,7 @@ HGResult HGAPI HGTwain_OpenDSM(HGTwainDSM dsm, HWND hwnd, HGDSEventFunc func, HG
|
||||||
}
|
}
|
||||||
|
|
||||||
HGTwainDSMImpl* twainDSMImpl = (HGTwainDSMImpl*)dsm;
|
HGTwainDSMImpl* twainDSMImpl = (HGTwainDSMImpl*)dsm;
|
||||||
return twainDSMImpl->OpenDSM(hwnd, func, param);
|
return twainDSMImpl->OpenDSM(hwnd);
|
||||||
}
|
}
|
||||||
|
|
||||||
HGResult HGAPI HGTwain_CloseDSM(HGTwainDSM dsm)
|
HGResult HGAPI HGTwain_CloseDSM(HGTwainDSM dsm)
|
||||||
|
@ -101,7 +101,7 @@ HGResult HGAPI HGTwain_GetDSName(HGTwainDS ds, HGChar* name, HGUInt maxLen)
|
||||||
}
|
}
|
||||||
|
|
||||||
HGTwainDSImpl* twainDSImpl = (HGTwainDSImpl*)ds;
|
HGTwainDSImpl* twainDSImpl = (HGTwainDSImpl*)ds;
|
||||||
return twainDSImpl->dsmImpl->GetDSName(twainDSImpl, name, maxLen);
|
return twainDSImpl->GetName(name, maxLen);
|
||||||
}
|
}
|
||||||
|
|
||||||
HGResult HGAPI HGTwain_OpenDS(HGTwainDS ds)
|
HGResult HGAPI HGTwain_OpenDS(HGTwainDS ds)
|
||||||
|
@ -112,7 +112,7 @@ HGResult HGAPI HGTwain_OpenDS(HGTwainDS ds)
|
||||||
}
|
}
|
||||||
|
|
||||||
HGTwainDSImpl* twainDSImpl = (HGTwainDSImpl*)ds;
|
HGTwainDSImpl* twainDSImpl = (HGTwainDSImpl*)ds;
|
||||||
return twainDSImpl->dsmImpl->OpenDS(twainDSImpl);
|
return twainDSImpl->Open();
|
||||||
}
|
}
|
||||||
|
|
||||||
HGResult HGAPI HGTwain_CloseDS(HGTwainDS ds)
|
HGResult HGAPI HGTwain_CloseDS(HGTwainDS ds)
|
||||||
|
@ -123,7 +123,7 @@ HGResult HGAPI HGTwain_CloseDS(HGTwainDS ds)
|
||||||
}
|
}
|
||||||
|
|
||||||
HGTwainDSImpl* twainDSImpl = (HGTwainDSImpl*)ds;
|
HGTwainDSImpl* twainDSImpl = (HGTwainDSImpl*)ds;
|
||||||
return twainDSImpl->dsmImpl->CloseDS(twainDSImpl);
|
return twainDSImpl->Close();
|
||||||
}
|
}
|
||||||
|
|
||||||
HGResult HGAPI HGTwain_SetCapability(HGTwainDS ds, HGUInt cap, HGInt value)
|
HGResult HGAPI HGTwain_SetCapability(HGTwainDS ds, HGUInt cap, HGInt value)
|
||||||
|
@ -134,7 +134,7 @@ HGResult HGAPI HGTwain_SetCapability(HGTwainDS ds, HGUInt cap, HGInt value)
|
||||||
}
|
}
|
||||||
|
|
||||||
HGTwainDSImpl* twainDSImpl = (HGTwainDSImpl*)ds;
|
HGTwainDSImpl* twainDSImpl = (HGTwainDSImpl*)ds;
|
||||||
return twainDSImpl->dsmImpl->SetCapability(twainDSImpl, cap, value);
|
return twainDSImpl->SetCap(cap, value);
|
||||||
}
|
}
|
||||||
|
|
||||||
HGResult HGAPI HGTwain_GetCapability(HGTwainDS ds, HGUInt cap, HGInt* value)
|
HGResult HGAPI HGTwain_GetCapability(HGTwainDS ds, HGUInt cap, HGInt* value)
|
||||||
|
@ -145,10 +145,10 @@ HGResult HGAPI HGTwain_GetCapability(HGTwainDS ds, HGUInt cap, HGInt* value)
|
||||||
}
|
}
|
||||||
|
|
||||||
HGTwainDSImpl* twainDSImpl = (HGTwainDSImpl*)ds;
|
HGTwainDSImpl* twainDSImpl = (HGTwainDSImpl*)ds;
|
||||||
return twainDSImpl->dsmImpl->GetCapability(twainDSImpl, cap, value);
|
return twainDSImpl->GetCap(cap, value);
|
||||||
}
|
}
|
||||||
|
|
||||||
HGResult HGAPI HGTwain_EnableDSUIOnly(HGTwainDS ds, HGBool showUI, HWND parent)
|
HGResult HGAPI HGTwain_EnableDSUIOnly(HGTwainDS ds, HGBool showUI, HWND parent, HGDSEventFunc func, HGPointer param)
|
||||||
{
|
{
|
||||||
if (NULL == ds)
|
if (NULL == ds)
|
||||||
{
|
{
|
||||||
|
@ -156,10 +156,10 @@ HGResult HGAPI HGTwain_EnableDSUIOnly(HGTwainDS ds, HGBool showUI, HWND parent)
|
||||||
}
|
}
|
||||||
|
|
||||||
HGTwainDSImpl* twainDSImpl = (HGTwainDSImpl*)ds;
|
HGTwainDSImpl* twainDSImpl = (HGTwainDSImpl*)ds;
|
||||||
return twainDSImpl->dsmImpl->EnableDSUIOnly(twainDSImpl, showUI, parent);
|
return twainDSImpl->EnableUIOnly(showUI, parent, func, param);
|
||||||
}
|
}
|
||||||
|
|
||||||
HGResult HGAPI HGTwain_EnableDS(HGTwainDS ds, HGBool showUI, HWND parent)
|
HGResult HGAPI HGTwain_EnableDS(HGTwainDS ds, HGBool showUI, HWND parent, HGDSEventFunc func, HGPointer param)
|
||||||
{
|
{
|
||||||
if (NULL == ds)
|
if (NULL == ds)
|
||||||
{
|
{
|
||||||
|
@ -167,7 +167,7 @@ HGResult HGAPI HGTwain_EnableDS(HGTwainDS ds, HGBool showUI, HWND parent)
|
||||||
}
|
}
|
||||||
|
|
||||||
HGTwainDSImpl* twainDSImpl = (HGTwainDSImpl*)ds;
|
HGTwainDSImpl* twainDSImpl = (HGTwainDSImpl*)ds;
|
||||||
return twainDSImpl->dsmImpl->EnableDS(twainDSImpl, showUI, parent);
|
return twainDSImpl->Enable(showUI, parent, func, param);
|
||||||
}
|
}
|
||||||
|
|
||||||
HGResult HGAPI HGTwain_DisableDS(HGTwainDS ds)
|
HGResult HGAPI HGTwain_DisableDS(HGTwainDS ds)
|
||||||
|
@ -178,7 +178,7 @@ HGResult HGAPI HGTwain_DisableDS(HGTwainDS ds)
|
||||||
}
|
}
|
||||||
|
|
||||||
HGTwainDSImpl* twainDSImpl = (HGTwainDSImpl*)ds;
|
HGTwainDSImpl* twainDSImpl = (HGTwainDSImpl*)ds;
|
||||||
return twainDSImpl->dsmImpl->DisableDS(twainDSImpl);
|
return twainDSImpl->Disable();
|
||||||
}
|
}
|
||||||
|
|
||||||
HGResult HGAPI HGTwain_ImageNativeXfer(HGTwainDS ds, HGUInt type, HGUInt origin, HGImage* image)
|
HGResult HGAPI HGTwain_ImageNativeXfer(HGTwainDS ds, HGUInt type, HGUInt origin, HGImage* image)
|
||||||
|
@ -189,7 +189,7 @@ HGResult HGAPI HGTwain_ImageNativeXfer(HGTwainDS ds, HGUInt type, HGUInt origin,
|
||||||
}
|
}
|
||||||
|
|
||||||
HGTwainDSImpl* twainDSImpl = (HGTwainDSImpl*)ds;
|
HGTwainDSImpl* twainDSImpl = (HGTwainDSImpl*)ds;
|
||||||
return twainDSImpl->dsmImpl->ImageNativeXfer(twainDSImpl, type, origin, image);
|
return twainDSImpl->ImageNativeXfer(type, origin, image);
|
||||||
}
|
}
|
||||||
|
|
||||||
HGResult HGAPI HGTwain_EndXfer(HGTwainDS ds, HGUInt* count)
|
HGResult HGAPI HGTwain_EndXfer(HGTwainDS ds, HGUInt* count)
|
||||||
|
@ -200,7 +200,7 @@ HGResult HGAPI HGTwain_EndXfer(HGTwainDS ds, HGUInt* count)
|
||||||
}
|
}
|
||||||
|
|
||||||
HGTwainDSImpl* twainDSImpl = (HGTwainDSImpl*)ds;
|
HGTwainDSImpl* twainDSImpl = (HGTwainDSImpl*)ds;
|
||||||
return twainDSImpl->dsmImpl->EndXfer(twainDSImpl, count);
|
return twainDSImpl->EndXfer(count);
|
||||||
}
|
}
|
||||||
|
|
||||||
HGResult HGAPI HGTwain_Reset(HGTwainDS ds)
|
HGResult HGAPI HGTwain_Reset(HGTwainDS ds)
|
||||||
|
@ -211,5 +211,5 @@ HGResult HGAPI HGTwain_Reset(HGTwainDS ds)
|
||||||
}
|
}
|
||||||
|
|
||||||
HGTwainDSImpl* twainDSImpl = (HGTwainDSImpl*)ds;
|
HGTwainDSImpl* twainDSImpl = (HGTwainDSImpl*)ds;
|
||||||
return twainDSImpl->dsmImpl->Reset(twainDSImpl);
|
return twainDSImpl->Reset();
|
||||||
}
|
}
|
|
@ -54,7 +54,7 @@ HGEXPORT HGResult HGAPI HGTwain_UnloadDSM(HGTwainDSM dsm);
|
||||||
* 1) 执行此函数后,TWAIN状态从2变为3
|
* 1) 执行此函数后,TWAIN状态从2变为3
|
||||||
* 2) 调用该函数的线程需要有消息循环
|
* 2) 调用该函数的线程需要有消息循环
|
||||||
*/
|
*/
|
||||||
HGEXPORT HGResult HGAPI HGTwain_OpenDSM(HGTwainDSM dsm, HWND hwnd, HGDSEventFunc func, HGPointer param);
|
HGEXPORT HGResult HGAPI HGTwain_OpenDSM(HGTwainDSM dsm, HWND hwnd);
|
||||||
|
|
||||||
/* 关闭DSM
|
/* 关闭DSM
|
||||||
* 参数:
|
* 参数:
|
||||||
|
@ -150,7 +150,7 @@ HGEXPORT HGResult HGAPI HGTwain_GetCapability(HGTwainDS ds, HGUInt cap, HGInt* v
|
||||||
* 说明:
|
* 说明:
|
||||||
* 1) 执行此函数后,TWAIN状态从4变为5
|
* 1) 执行此函数后,TWAIN状态从4变为5
|
||||||
*/
|
*/
|
||||||
HGEXPORT HGResult HGAPI HGTwain_EnableDSUIOnly(HGTwainDS ds, HGBool showUI, HWND parent);
|
HGEXPORT HGResult HGAPI HGTwain_EnableDSUIOnly(HGTwainDS ds, HGBool showUI, HWND parent, HGDSEventFunc func, HGPointer param);
|
||||||
|
|
||||||
/* 启动DS
|
/* 启动DS
|
||||||
* 参数:
|
* 参数:
|
||||||
|
@ -162,7 +162,7 @@ HGEXPORT HGResult HGAPI HGTwain_EnableDSUIOnly(HGTwainDS ds, HGBool showUI, HWND
|
||||||
* 说明:
|
* 说明:
|
||||||
* 1) 执行此函数后,TWAIN状态从4变为5
|
* 1) 执行此函数后,TWAIN状态从4变为5
|
||||||
*/
|
*/
|
||||||
HGEXPORT HGResult HGAPI HGTwain_EnableDS(HGTwainDS ds, HGBool showUI, HWND parent);
|
HGEXPORT HGResult HGAPI HGTwain_EnableDS(HGTwainDS ds, HGBool showUI, HWND parent, HGDSEventFunc func, HGPointer param);
|
||||||
|
|
||||||
/* 停止DS
|
/* 停止DS
|
||||||
* 参数:
|
* 参数:
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
#include "HGTwainImpl.hpp"
|
#include "HGTwainImpl.hpp"
|
||||||
#include "../base/HGInc.h"
|
#include "../base/HGInc.h"
|
||||||
|
#include "../base/HGInfo.h"
|
||||||
|
|
||||||
std::map<HWND, HGTwainDSMImpl*> HGTwainDSMImpl::m_mapWnd;
|
std::map<HWND, HGTwainDSMImpl*> HGTwainDSMImpl::m_mapWnd;
|
||||||
|
|
||||||
|
@ -10,8 +11,6 @@ HGTwainDSMImpl::HGTwainDSMImpl()
|
||||||
GetIdentity();
|
GetIdentity();
|
||||||
m_hWnd = NULL;
|
m_hWnd = NULL;
|
||||||
m_oldWndProc = NULL;
|
m_oldWndProc = NULL;
|
||||||
m_dsEventFunc = NULL;
|
|
||||||
m_dsEventParam = NULL;
|
|
||||||
m_DSMOpen = HGFALSE;
|
m_DSMOpen = HGFALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -61,13 +60,18 @@ HGResult HGTwainDSMImpl::UnloadDSM()
|
||||||
return HGBASE_ERR_OK;
|
return HGBASE_ERR_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
HGResult HGTwainDSMImpl::OpenDSM(HWND hwnd, HGDSEventFunc func, HGPointer param)
|
HGResult HGTwainDSMImpl::OpenDSM(HWND hwnd)
|
||||||
{
|
{
|
||||||
if (NULL == m_pDSMProc || m_DSMOpen || NULL == hwnd || NULL == func)
|
if (NULL == m_pDSMProc || m_DSMOpen)
|
||||||
{
|
{
|
||||||
return HGBASE_ERR_FAIL;
|
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)
|
||||||
{
|
{
|
||||||
|
@ -77,8 +81,6 @@ HGResult HGTwainDSMImpl::OpenDSM(HWND hwnd, HGDSEventFunc func, HGPointer param)
|
||||||
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_dsEventFunc = func;
|
|
||||||
m_dsEventParam = param;
|
|
||||||
m_DSMOpen = HGTRUE;
|
m_DSMOpen = HGTRUE;
|
||||||
|
|
||||||
// 获取DS列表
|
// 获取DS列表
|
||||||
|
@ -86,15 +88,13 @@ HGResult HGTwainDSMImpl::OpenDSM(HWND hwnd, HGDSEventFunc func, HGPointer param)
|
||||||
ret = m_pDSMProc(&m_AppId, NULL, DG_CONTROL, DAT_IDENTITY, MSG_GETFIRST, &ds);
|
ret = m_pDSMProc(&m_AppId, NULL, DG_CONTROL, DAT_IDENTITY, MSG_GETFIRST, &ds);
|
||||||
if (TWRC_SUCCESS == ret)
|
if (TWRC_SUCCESS == ret)
|
||||||
{
|
{
|
||||||
HGTwainDSImpl dsImpl(this);
|
HGTwainDSImpl* dsImpl = new HGTwainDSImpl(this, &ds);
|
||||||
memcpy(&dsImpl.ds, &ds, sizeof(TW_IDENTITY));
|
m_vpDSImpl.push_back(dsImpl);
|
||||||
m_DSList.push_back(dsImpl);
|
|
||||||
|
|
||||||
while (TWRC_SUCCESS == m_pDSMProc(&m_AppId, NULL, DG_CONTROL, DAT_IDENTITY, MSG_GETNEXT, &ds))
|
while (TWRC_SUCCESS == m_pDSMProc(&m_AppId, NULL, DG_CONTROL, DAT_IDENTITY, MSG_GETNEXT, &ds))
|
||||||
{
|
{
|
||||||
HGTwainDSImpl dsImpl(this);
|
HGTwainDSImpl* dsImpl = new HGTwainDSImpl(this, &ds);
|
||||||
memcpy(&dsImpl.ds, &ds, sizeof(TW_IDENTITY));
|
m_vpDSImpl.push_back(dsImpl);
|
||||||
m_DSList.push_back(dsImpl);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -109,13 +109,12 @@ HGResult HGTwainDSMImpl::CloseDSM()
|
||||||
}
|
}
|
||||||
|
|
||||||
// 先必须关闭DS
|
// 先必须关闭DS
|
||||||
for (int i = 0; i < (int)m_DSList.size(); ++i)
|
for (int i = 0; i < (int)m_vpDSImpl.size(); ++i)
|
||||||
{
|
{
|
||||||
CloseDS(&m_DSList[i]);
|
m_vpDSImpl[i]->Close();
|
||||||
|
delete m_vpDSImpl[i];
|
||||||
}
|
}
|
||||||
|
m_vpDSImpl.clear();
|
||||||
// 清理DS列表
|
|
||||||
m_DSList.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);
|
||||||
|
@ -130,28 +129,26 @@ HGResult HGTwainDSMImpl::CloseDSM()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
m_hWnd = NULL;
|
m_hWnd = NULL;
|
||||||
m_dsEventFunc = NULL;
|
|
||||||
m_dsEventParam = NULL;
|
|
||||||
m_DSMOpen = HGFALSE;
|
m_DSMOpen = HGFALSE;
|
||||||
return HGBASE_ERR_OK;
|
return HGBASE_ERR_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
HGResult HGTwainDSMImpl::GetDSList(HGTwainDSImpl** ds, HGUInt* size)
|
HGResult HGTwainDSMImpl::GetDSList(class HGTwainDSImpl** dsImpl, HGUInt* size)
|
||||||
{
|
{
|
||||||
if (NULL == ds || NULL == size || 0 == *size)
|
|
||||||
{
|
|
||||||
return HGBASE_ERR_INVALIDARG;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!m_DSMOpen)
|
if (!m_DSMOpen)
|
||||||
{
|
{
|
||||||
return HGBASE_ERR_FAIL;
|
return HGBASE_ERR_FAIL;
|
||||||
}
|
}
|
||||||
|
|
||||||
HGUInt count = 0;
|
if (NULL == dsImpl || NULL == size || 0 == *size)
|
||||||
for (int i = 0; i < (int)m_DSList.size(); ++i)
|
|
||||||
{
|
{
|
||||||
ds[i] = &m_DSList[i];
|
return HGBASE_ERR_INVALIDARG;
|
||||||
|
}
|
||||||
|
|
||||||
|
HGUInt count = 0;
|
||||||
|
for (int i = 0; i < (int)m_vpDSImpl.size(); ++i)
|
||||||
|
{
|
||||||
|
dsImpl[i] = m_vpDSImpl[i];
|
||||||
++count;
|
++count;
|
||||||
|
|
||||||
if (count >= *size)
|
if (count >= *size)
|
||||||
|
@ -164,18 +161,18 @@ HGResult HGTwainDSMImpl::GetDSList(HGTwainDSImpl** ds, HGUInt* size)
|
||||||
return HGBASE_ERR_OK;
|
return HGBASE_ERR_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
HGResult HGTwainDSMImpl::GetDefaultDS(HGTwainDSImpl** ds)
|
HGResult HGTwainDSMImpl::GetDefaultDS(class HGTwainDSImpl** dsImpl)
|
||||||
{
|
{
|
||||||
if (NULL == ds)
|
|
||||||
{
|
|
||||||
return HGBASE_ERR_INVALIDARG;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!m_DSMOpen)
|
if (!m_DSMOpen)
|
||||||
{
|
{
|
||||||
return HGBASE_ERR_FAIL;
|
return HGBASE_ERR_FAIL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (NULL == dsImpl)
|
||||||
|
{
|
||||||
|
return HGBASE_ERR_INVALIDARG;
|
||||||
|
}
|
||||||
|
|
||||||
assert(NULL != m_pDSMProc);
|
assert(NULL != m_pDSMProc);
|
||||||
TW_IDENTITY defDS;
|
TW_IDENTITY defDS;
|
||||||
USHORT ret = m_pDSMProc(&m_AppId, NULL, DG_CONTROL, DAT_IDENTITY, MSG_GETDEFAULT, &defDS);
|
USHORT ret = m_pDSMProc(&m_AppId, NULL, DG_CONTROL, DAT_IDENTITY, MSG_GETDEFAULT, &defDS);
|
||||||
|
@ -184,11 +181,11 @@ HGResult HGTwainDSMImpl::GetDefaultDS(HGTwainDSImpl** ds)
|
||||||
return HGBASE_ERR_FAIL;
|
return HGBASE_ERR_FAIL;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (int i = 0; i < (int)m_DSList.size(); ++i)
|
for (int i = 0; i < (int)m_vpDSImpl.size(); ++i)
|
||||||
{
|
{
|
||||||
if (0 == memcmp(&defDS, &m_DSList[i].ds, sizeof(TW_IDENTITY)))
|
if (0 == memcmp(&defDS, &m_vpDSImpl[i]->m_iden, sizeof(TW_IDENTITY)))
|
||||||
{
|
{
|
||||||
*ds = &m_DSList[i];
|
*dsImpl = m_vpDSImpl[i];
|
||||||
return HGBASE_ERR_OK;
|
return HGBASE_ERR_OK;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -196,18 +193,18 @@ HGResult HGTwainDSMImpl::GetDefaultDS(HGTwainDSImpl** ds)
|
||||||
return HGBASE_ERR_FAIL;
|
return HGBASE_ERR_FAIL;
|
||||||
}
|
}
|
||||||
|
|
||||||
HGResult HGTwainDSMImpl::SelectDS(HGTwainDSImpl** ds)
|
HGResult HGTwainDSMImpl::SelectDS(class HGTwainDSImpl** dsImpl)
|
||||||
{
|
{
|
||||||
if (NULL == ds)
|
|
||||||
{
|
|
||||||
return HGBASE_ERR_INVALIDARG;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!m_DSMOpen)
|
if (!m_DSMOpen)
|
||||||
{
|
{
|
||||||
return HGBASE_ERR_FAIL;
|
return HGBASE_ERR_FAIL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (NULL == dsImpl)
|
||||||
|
{
|
||||||
|
return HGBASE_ERR_INVALIDARG;
|
||||||
|
}
|
||||||
|
|
||||||
assert(NULL != m_pDSMProc);
|
assert(NULL != m_pDSMProc);
|
||||||
TW_IDENTITY selectDS;
|
TW_IDENTITY selectDS;
|
||||||
USHORT ret = m_pDSMProc(&m_AppId, NULL, DG_CONTROL, DAT_IDENTITY, MSG_USERSELECT, &selectDS);
|
USHORT ret = m_pDSMProc(&m_AppId, NULL, DG_CONTROL, DAT_IDENTITY, MSG_USERSELECT, &selectDS);
|
||||||
|
@ -216,407 +213,11 @@ HGResult HGTwainDSMImpl::SelectDS(HGTwainDSImpl** ds)
|
||||||
return HGBASE_ERR_FAIL;
|
return HGBASE_ERR_FAIL;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (int i = 0; i < (int)m_DSList.size(); ++i)
|
for (int i = 0; i < (int)m_vpDSImpl.size(); ++i)
|
||||||
{
|
{
|
||||||
if (0 == memcmp(&selectDS, &m_DSList[i].ds, sizeof(TW_IDENTITY)))
|
if (0 == memcmp(&selectDS, &m_vpDSImpl[i]->m_iden, sizeof(TW_IDENTITY)))
|
||||||
{
|
{
|
||||||
*ds = &m_DSList[i];
|
*dsImpl = m_vpDSImpl[i];
|
||||||
return HGBASE_ERR_OK;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return HGBASE_ERR_FAIL;
|
|
||||||
}
|
|
||||||
|
|
||||||
HGResult HGTwainDSMImpl::GetDSName(HGTwainDSImpl* ds, HGChar* name, HGUInt maxLen)
|
|
||||||
{
|
|
||||||
if (NULL == ds || NULL == name || 0 == maxLen)
|
|
||||||
{
|
|
||||||
return HGBASE_ERR_INVALIDARG;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!m_DSMOpen)
|
|
||||||
{
|
|
||||||
return HGBASE_ERR_FAIL;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (int i = 0; i < (int)m_DSList.size(); ++i)
|
|
||||||
{
|
|
||||||
if (ds == &m_DSList[i])
|
|
||||||
{
|
|
||||||
strcpy_s(name, maxLen, m_DSList[i].ds.ProductName);
|
|
||||||
return HGBASE_ERR_OK;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return HGBASE_ERR_FAIL;
|
|
||||||
}
|
|
||||||
|
|
||||||
HGResult HGTwainDSMImpl::OpenDS(HGTwainDSImpl* ds)
|
|
||||||
{
|
|
||||||
if (NULL == ds)
|
|
||||||
{
|
|
||||||
return HGBASE_ERR_INVALIDARG;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!m_DSMOpen)
|
|
||||||
{
|
|
||||||
return HGBASE_ERR_FAIL;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (int i = 0; i < (int)m_DSList.size(); ++i)
|
|
||||||
{
|
|
||||||
if (ds == &m_DSList[i])
|
|
||||||
{
|
|
||||||
if (m_DSList[i].open)
|
|
||||||
{
|
|
||||||
return HGBASE_ERR_FAIL;
|
|
||||||
}
|
|
||||||
|
|
||||||
USHORT ret = m_pDSMProc(&m_AppId, NULL, DG_CONTROL, DAT_IDENTITY, MSG_OPENDS, &m_DSList[i].ds);
|
|
||||||
if (TWRC_SUCCESS != ret)
|
|
||||||
{
|
|
||||||
return HGBASE_ERR_FAIL;
|
|
||||||
}
|
|
||||||
|
|
||||||
m_DSList[i].open = HGTRUE;
|
|
||||||
return HGBASE_ERR_OK;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return HGBASE_ERR_FAIL;
|
|
||||||
}
|
|
||||||
|
|
||||||
HGResult HGTwainDSMImpl::CloseDS(HGTwainDSImpl* ds)
|
|
||||||
{
|
|
||||||
if (NULL == ds)
|
|
||||||
{
|
|
||||||
return HGBASE_ERR_INVALIDARG;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (int i = 0; i < (int)m_DSList.size(); ++i)
|
|
||||||
{
|
|
||||||
if (ds == &m_DSList[i])
|
|
||||||
{
|
|
||||||
if (!m_DSList[i].open)
|
|
||||||
{
|
|
||||||
return HGBASE_ERR_FAIL;
|
|
||||||
}
|
|
||||||
|
|
||||||
DisableDS(ds);
|
|
||||||
m_pDSMProc(&m_AppId, NULL, DG_CONTROL, DAT_IDENTITY, MSG_CLOSEDS, (TW_MEMREF)&m_DSList[i].ds);
|
|
||||||
|
|
||||||
m_DSList[i].open = HGFALSE;
|
|
||||||
return HGBASE_ERR_OK;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return HGBASE_ERR_FAIL;
|
|
||||||
}
|
|
||||||
|
|
||||||
HGResult HGTwainDSMImpl::SetCapability(HGTwainDSImpl* ds, HGUInt cap, HGInt value)
|
|
||||||
{
|
|
||||||
if (NULL == ds)
|
|
||||||
{
|
|
||||||
return HGBASE_ERR_INVALIDARG;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (int i = 0; i < (int)m_DSList.size(); ++i)
|
|
||||||
{
|
|
||||||
if (ds == &m_DSList[i])
|
|
||||||
{
|
|
||||||
if (!m_DSList[i].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_pDSMProc(&m_AppId, &m_DSList[i].ds, 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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return HGBASE_ERR_FAIL;
|
|
||||||
}
|
|
||||||
|
|
||||||
HGResult HGTwainDSMImpl::GetCapability(HGTwainDSImpl* ds, HGUInt cap, HGInt* value)
|
|
||||||
{
|
|
||||||
if (NULL == ds || NULL == value)
|
|
||||||
{
|
|
||||||
return HGBASE_ERR_INVALIDARG;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (int i = 0; i < (int)m_DSList.size(); ++i)
|
|
||||||
{
|
|
||||||
if (ds == &m_DSList[i])
|
|
||||||
{
|
|
||||||
if (!m_DSList[i].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 = NULL;
|
|
||||||
|
|
||||||
USHORT ret = m_pDSMProc(&m_AppId, &m_DSList[i].ds, 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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return HGBASE_ERR_FAIL;
|
|
||||||
}
|
|
||||||
|
|
||||||
HGResult HGTwainDSMImpl::EnableDSUIOnly(HGTwainDSImpl* ds, HGBool showUI, HWND parent)
|
|
||||||
{
|
|
||||||
if (NULL == ds)
|
|
||||||
{
|
|
||||||
return HGBASE_ERR_INVALIDARG;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (int i = 0; i < (int)m_DSList.size(); ++i)
|
|
||||||
{
|
|
||||||
if (ds == &m_DSList[i])
|
|
||||||
{
|
|
||||||
if (!m_DSList[i].open || m_DSList[i].enable)
|
|
||||||
{
|
|
||||||
return HGBASE_ERR_FAIL;
|
|
||||||
}
|
|
||||||
|
|
||||||
TW_USERINTERFACE twUI;
|
|
||||||
twUI.ShowUI = (TW_BOOL)showUI;
|
|
||||||
twUI.hParent = (TW_HANDLE)parent;
|
|
||||||
USHORT ret = m_pDSMProc(&m_AppId, &m_DSList[i].ds, DG_CONTROL, DAT_USERINTERFACE, MSG_ENABLEDSUIONLY, (TW_MEMREF)&twUI);
|
|
||||||
if (TWRC_SUCCESS != ret)
|
|
||||||
{
|
|
||||||
return HGBASE_ERR_FAIL;
|
|
||||||
}
|
|
||||||
|
|
||||||
m_DSList[i].showUI = showUI;
|
|
||||||
m_DSList[i].parent = parent;
|
|
||||||
m_DSList[i].enable = HGTRUE;
|
|
||||||
return HGBASE_ERR_OK;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return HGBASE_ERR_FAIL;
|
|
||||||
}
|
|
||||||
|
|
||||||
HGResult HGTwainDSMImpl::EnableDS(HGTwainDSImpl* ds, HGBool showUI, HWND parent)
|
|
||||||
{
|
|
||||||
if (NULL == ds)
|
|
||||||
{
|
|
||||||
return HGBASE_ERR_INVALIDARG;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (int i = 0; i < (int)m_DSList.size(); ++i)
|
|
||||||
{
|
|
||||||
if (ds == &m_DSList[i])
|
|
||||||
{
|
|
||||||
if (!m_DSList[i].open || m_DSList[i].enable)
|
|
||||||
{
|
|
||||||
return HGBASE_ERR_FAIL;
|
|
||||||
}
|
|
||||||
|
|
||||||
TW_USERINTERFACE twUI;
|
|
||||||
twUI.ShowUI = (TW_BOOL)showUI;
|
|
||||||
twUI.hParent = (TW_HANDLE)parent;
|
|
||||||
USHORT ret = m_pDSMProc(&m_AppId, &m_DSList[i].ds, DG_CONTROL, DAT_USERINTERFACE, MSG_ENABLEDS, (TW_MEMREF)&twUI);
|
|
||||||
if (TWRC_SUCCESS != ret)
|
|
||||||
{
|
|
||||||
return HGBASE_ERR_FAIL;
|
|
||||||
}
|
|
||||||
|
|
||||||
m_DSList[i].showUI = showUI;
|
|
||||||
m_DSList[i].parent = parent;
|
|
||||||
m_DSList[i].enable = HGTRUE;
|
|
||||||
return HGBASE_ERR_OK;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return HGBASE_ERR_FAIL;
|
|
||||||
}
|
|
||||||
|
|
||||||
HGResult HGTwainDSMImpl::DisableDS(HGTwainDSImpl* ds)
|
|
||||||
{
|
|
||||||
if (NULL == ds)
|
|
||||||
{
|
|
||||||
return HGBASE_ERR_INVALIDARG;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (int i = 0; i < (int)m_DSList.size(); ++i)
|
|
||||||
{
|
|
||||||
if (ds == &m_DSList[i])
|
|
||||||
{
|
|
||||||
if (!m_DSList[i].enable)
|
|
||||||
{
|
|
||||||
return HGBASE_ERR_FAIL;
|
|
||||||
}
|
|
||||||
|
|
||||||
TW_USERINTERFACE twUI;
|
|
||||||
twUI.ShowUI = (TW_BOOL)m_DSList[i].showUI;
|
|
||||||
twUI.hParent = (TW_HANDLE)m_DSList[i].parent;
|
|
||||||
m_pDSMProc(&m_AppId, &m_DSList[i].ds, DG_CONTROL, DAT_USERINTERFACE, MSG_DISABLEDS, &twUI);
|
|
||||||
|
|
||||||
m_DSList[i].showUI = HGFALSE;
|
|
||||||
m_DSList[i].parent = NULL;
|
|
||||||
m_DSList[i].enable = HGFALSE;
|
|
||||||
return HGBASE_ERR_OK;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return HGBASE_ERR_FAIL;
|
|
||||||
}
|
|
||||||
|
|
||||||
HGResult HGTwainDSMImpl::ImageNativeXfer(HGTwainDSImpl* ds, HGUInt type, HGUInt origin, HGImage* image)
|
|
||||||
{
|
|
||||||
if (NULL == ds || NULL == image)
|
|
||||||
{
|
|
||||||
return HGBASE_ERR_INVALIDARG;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (int i = 0; i < (int)m_DSList.size(); ++i)
|
|
||||||
{
|
|
||||||
if (ds == &m_DSList[i])
|
|
||||||
{
|
|
||||||
if (!m_DSList[i].enable)
|
|
||||||
{
|
|
||||||
return HGBASE_ERR_FAIL;
|
|
||||||
}
|
|
||||||
|
|
||||||
TW_IMAGEINFO info;
|
|
||||||
if (TWRC_SUCCESS != m_pDSMProc(&m_AppId, &m_DSList[i].ds, DG_IMAGE, DAT_IMAGEINFO, MSG_GET, (TW_MEMREF)&info))
|
|
||||||
{
|
|
||||||
return HGBASE_ERR_FAIL;
|
|
||||||
}
|
|
||||||
|
|
||||||
HANDLE hMem = NULL;
|
|
||||||
if (TWRC_XFERDONE != m_pDSMProc(&m_AppId, &m_DSList[i].ds, DG_IMAGE, DAT_IMAGENATIVEXFER, MSG_GET, &hMem))
|
|
||||||
{
|
|
||||||
return HGBASE_ERR_FAIL;
|
|
||||||
}
|
|
||||||
|
|
||||||
HGResult ret = HGBase_CreateImageFromDIB(hMem, NULL, type, origin, image);
|
|
||||||
GlobalFree(hMem);
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return HGBASE_ERR_FAIL;
|
|
||||||
}
|
|
||||||
|
|
||||||
HGResult HGTwainDSMImpl::EndXfer(HGTwainDSImpl* ds, HGUInt* count)
|
|
||||||
{
|
|
||||||
if (NULL == ds || NULL == count)
|
|
||||||
{
|
|
||||||
return HGBASE_ERR_INVALIDARG;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (int i = 0; i < (int)m_DSList.size(); ++i)
|
|
||||||
{
|
|
||||||
if (ds == &m_DSList[i])
|
|
||||||
{
|
|
||||||
if (!m_DSList[i].enable)
|
|
||||||
{
|
|
||||||
return HGBASE_ERR_FAIL;
|
|
||||||
}
|
|
||||||
|
|
||||||
TW_PENDINGXFERS twPend;
|
|
||||||
USHORT ret = m_pDSMProc(&m_AppId, &m_DSList[i].ds, DG_CONTROL, DAT_PENDINGXFERS, MSG_ENDXFER, (TW_MEMREF)&twPend);
|
|
||||||
if (TWRC_SUCCESS != ret)
|
|
||||||
{
|
|
||||||
return HGBASE_ERR_FAIL;
|
|
||||||
}
|
|
||||||
|
|
||||||
*count = twPend.Count;
|
|
||||||
return HGBASE_ERR_OK;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return HGBASE_ERR_FAIL;
|
|
||||||
}
|
|
||||||
|
|
||||||
HGResult HGTwainDSMImpl::Reset(HGTwainDSImpl* ds)
|
|
||||||
{
|
|
||||||
if (NULL == ds)
|
|
||||||
{
|
|
||||||
return HGBASE_ERR_INVALIDARG;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (int i = 0; i < (int)m_DSList.size(); ++i)
|
|
||||||
{
|
|
||||||
if (ds == &m_DSList[i])
|
|
||||||
{
|
|
||||||
if (!m_DSList[i].enable)
|
|
||||||
{
|
|
||||||
return HGBASE_ERR_FAIL;
|
|
||||||
}
|
|
||||||
|
|
||||||
TW_PENDINGXFERS twPend;
|
|
||||||
USHORT ret = m_pDSMProc(&m_AppId, &m_DSList[i].ds, DG_CONTROL, DAT_PENDINGXFERS, MSG_RESET, (TW_MEMREF)&twPend);
|
|
||||||
if (TWRC_SUCCESS != ret)
|
|
||||||
{
|
|
||||||
return HGBASE_ERR_FAIL;
|
|
||||||
}
|
|
||||||
|
|
||||||
return HGBASE_ERR_OK;
|
return HGBASE_ERR_OK;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -652,29 +253,321 @@ 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_DSList.size(); ++i)
|
for (int i = 0; i < (int)p->m_vpDSImpl.size(); ++i)
|
||||||
{
|
{
|
||||||
if (p->m_DSList[i].enable)
|
if (p->m_vpDSImpl[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_DSList[i].ds, DG_CONTROL, DAT_EVENT,
|
USHORT ret = p->m_pDSMProc(&p->m_AppId, &p->m_vpDSImpl[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;
|
HGUInt event = HGTWAIN_DSEVENT_UNKNOWN;
|
||||||
if (MSG_XFERREADY == twEvent.TWMessage)
|
if (MSG_XFERREADY == twEvent.TWMessage)
|
||||||
|
{
|
||||||
|
HGBase_WriteInfo(HGBASE_INFOTYPE_DEBUG, "MSG_XFERREADY");
|
||||||
event = HGTWAIN_DSEVENT_XFERREADY;
|
event = HGTWAIN_DSEVENT_XFERREADY;
|
||||||
|
}
|
||||||
else if (MSG_CLOSEDSREQ == twEvent.TWMessage)
|
else if (MSG_CLOSEDSREQ == twEvent.TWMessage)
|
||||||
|
{
|
||||||
|
HGBase_WriteInfo(HGBASE_INFOTYPE_DEBUG, "MSG_CLOSEDSREQ");
|
||||||
event = HGTWAIN_DSEVENT_CLOSEDSREQ;
|
event = HGTWAIN_DSEVENT_CLOSEDSREQ;
|
||||||
|
}
|
||||||
else if (MSG_CLOSEDSOK == twEvent.TWMessage)
|
else if (MSG_CLOSEDSOK == twEvent.TWMessage)
|
||||||
|
{
|
||||||
|
HGBase_WriteInfo(HGBASE_INFOTYPE_DEBUG, "MSG_CLOSEDSOK");
|
||||||
event = HGTWAIN_DSEVENT_CLOSEDSOK;
|
event = HGTWAIN_DSEVENT_CLOSEDSOK;
|
||||||
|
}
|
||||||
|
|
||||||
p->m_dsEventFunc((HGTwainDS)&p->m_DSList[i], event, p->m_dsEventParam);
|
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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return CallWindowProcW(p->m_oldWndProc, hWnd, msg, wParam, lParam);
|
return CallWindowProcW(p->m_oldWndProc, hWnd, msg, wParam, lParam);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
|
HGTwainDSImpl::~HGTwainDSImpl()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
HGResult HGTwainDSImpl::GetName(HGChar* name, HGUInt maxLen)
|
||||||
|
{
|
||||||
|
strcpy_s(name, maxLen, m_iden.ProductName);
|
||||||
|
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);
|
||||||
|
if (TWRC_SUCCESS != ret)
|
||||||
|
{
|
||||||
|
return HGBASE_ERR_FAIL;
|
||||||
|
}
|
||||||
|
|
||||||
|
m_open = HGTRUE;
|
||||||
|
return HGBASE_ERR_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
HGResult HGTwainDSImpl::Close()
|
||||||
|
{
|
||||||
|
if (!m_open)
|
||||||
|
{
|
||||||
|
return HGBASE_ERR_FAIL;
|
||||||
|
}
|
||||||
|
|
||||||
|
Disable();
|
||||||
|
m_dsmImpl->m_pDSMProc(&m_dsmImpl->m_AppId, NULL, DG_CONTROL, DAT_IDENTITY, MSG_CLOSEDS, (TW_MEMREF)&m_iden);
|
||||||
|
|
||||||
|
m_open = HGFALSE;
|
||||||
|
return HGBASE_ERR_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
HGResult HGTwainDSImpl::SetCap(HGUInt cap, HGInt value)
|
||||||
|
{
|
||||||
|
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)
|
||||||
|
{
|
||||||
|
return HGBASE_ERR_FAIL;
|
||||||
|
}
|
||||||
|
|
||||||
|
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)
|
||||||
|
{
|
||||||
|
return HGBASE_ERR_FAIL;
|
||||||
|
}
|
||||||
|
|
||||||
|
m_showUI = showUI;
|
||||||
|
m_parent = parent;
|
||||||
|
m_eventFunc = func;
|
||||||
|
m_eventParam = param;
|
||||||
|
m_enable = HGTRUE;
|
||||||
|
return HGBASE_ERR_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
HGResult HGTwainDSImpl::Enable(HGBool showUI, HWND parent, HGDSEventFunc func, HGPointer param)
|
||||||
|
{
|
||||||
|
if (!m_open || m_enable)
|
||||||
|
{
|
||||||
|
return HGBASE_ERR_FAIL;
|
||||||
|
}
|
||||||
|
|
||||||
|
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)
|
||||||
|
{
|
||||||
|
return HGBASE_ERR_FAIL;
|
||||||
|
}
|
||||||
|
|
||||||
|
m_showUI = showUI;
|
||||||
|
m_parent = parent;
|
||||||
|
m_eventFunc = func;
|
||||||
|
m_eventParam = param;
|
||||||
|
m_enable = HGTRUE;
|
||||||
|
return HGBASE_ERR_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
HGResult HGTwainDSImpl::Disable()
|
||||||
|
{
|
||||||
|
if (!m_enable)
|
||||||
|
{
|
||||||
|
return HGBASE_ERR_FAIL;
|
||||||
|
}
|
||||||
|
|
||||||
|
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);
|
||||||
|
|
||||||
|
m_showUI = HGFALSE;
|
||||||
|
m_parent = NULL;
|
||||||
|
m_eventFunc = NULL;
|
||||||
|
m_eventParam = NULL;
|
||||||
|
m_enable = HGFALSE;
|
||||||
|
return HGBASE_ERR_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
HGResult HGTwainDSImpl::ImageNativeXfer(HGUInt type, HGUInt origin, HGImage* image)
|
||||||
|
{
|
||||||
|
if (!m_enable)
|
||||||
|
{
|
||||||
|
return HGBASE_ERR_FAIL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (NULL == image)
|
||||||
|
{
|
||||||
|
return HGBASE_ERR_INVALIDARG;
|
||||||
|
}
|
||||||
|
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
|
HGResult ret = HGBase_CreateImageFromDIB(hMem, NULL, type, origin, image);
|
||||||
|
GlobalFree(hMem);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
HGResult HGTwainDSImpl::EndXfer(HGUInt* count)
|
||||||
|
{
|
||||||
|
if (!m_enable)
|
||||||
|
{
|
||||||
|
return HGBASE_ERR_FAIL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (NULL == count)
|
||||||
|
{
|
||||||
|
return HGBASE_ERR_INVALIDARG;
|
||||||
|
}
|
||||||
|
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
|
*count = twPend.Count;
|
||||||
|
return HGBASE_ERR_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
HGResult HGTwainDSImpl::Reset()
|
||||||
|
{
|
||||||
|
if (!m_enable)
|
||||||
|
{
|
||||||
|
return HGBASE_ERR_FAIL;
|
||||||
|
}
|
||||||
|
|
||||||
|
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)
|
||||||
|
{
|
||||||
|
return HGBASE_ERR_FAIL;
|
||||||
|
}
|
||||||
|
|
||||||
|
return HGBASE_ERR_OK;
|
||||||
|
}
|
|
@ -7,52 +7,20 @@
|
||||||
#include <vector>
|
#include <vector>
|
||||||
#include <map>
|
#include <map>
|
||||||
|
|
||||||
struct HGTwainDSImpl
|
|
||||||
{
|
|
||||||
HGTwainDSImpl(class HGTwainDSMImpl *dsm)
|
|
||||||
{
|
|
||||||
dsmImpl = dsm;
|
|
||||||
memset(&ds, 0, sizeof(TW_IDENTITY));
|
|
||||||
open = HGFALSE;
|
|
||||||
showUI = HGFALSE;
|
|
||||||
parent = NULL;
|
|
||||||
enable = HGFALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
class HGTwainDSMImpl* dsmImpl;
|
|
||||||
TW_IDENTITY ds;
|
|
||||||
HGBool open;
|
|
||||||
HGBool showUI;
|
|
||||||
HWND parent;
|
|
||||||
HGBool enable;
|
|
||||||
};
|
|
||||||
|
|
||||||
class HGTwainDSMImpl
|
class HGTwainDSMImpl
|
||||||
{
|
{
|
||||||
|
friend class HGTwainDSImpl;
|
||||||
public:
|
public:
|
||||||
HGTwainDSMImpl();
|
HGTwainDSMImpl();
|
||||||
~HGTwainDSMImpl();
|
~HGTwainDSMImpl();
|
||||||
|
|
||||||
HGResult LoadDSM();
|
HGResult LoadDSM();
|
||||||
HGResult UnloadDSM();
|
HGResult UnloadDSM();
|
||||||
HGResult OpenDSM(HWND hwnd, HGDSEventFunc func, HGPointer param);
|
HGResult OpenDSM(HWND hwnd);
|
||||||
HGResult CloseDSM();
|
HGResult CloseDSM();
|
||||||
|
HGResult GetDSList(class HGTwainDSImpl** dsImpl, HGUInt* size);
|
||||||
HGResult GetDSList(HGTwainDSImpl** ds, HGUInt* size);
|
HGResult GetDefaultDS(class HGTwainDSImpl** dsImpl);
|
||||||
HGResult GetDefaultDS(HGTwainDSImpl** ds);
|
HGResult SelectDS(class HGTwainDSImpl** dsImpl);
|
||||||
HGResult SelectDS(HGTwainDSImpl** ds);
|
|
||||||
HGResult GetDSName(HGTwainDSImpl* ds, HGChar* name, HGUInt maxLen);
|
|
||||||
HGResult OpenDS(HGTwainDSImpl* ds);
|
|
||||||
HGResult CloseDS(HGTwainDSImpl* ds);
|
|
||||||
HGResult SetCapability(HGTwainDSImpl* ds, HGUInt cap, HGInt value);
|
|
||||||
HGResult GetCapability(HGTwainDSImpl* ds, HGUInt cap, HGInt* value);
|
|
||||||
|
|
||||||
HGResult EnableDSUIOnly(HGTwainDSImpl* ds, HGBool showUI, HWND parent);
|
|
||||||
HGResult EnableDS(HGTwainDSImpl* ds, HGBool showUI, HWND parent);
|
|
||||||
HGResult DisableDS(HGTwainDSImpl* ds);
|
|
||||||
HGResult ImageNativeXfer(HGTwainDSImpl* ds, HGUInt type, HGUInt origin, HGImage* image);
|
|
||||||
HGResult EndXfer(HGTwainDSImpl* ds, HGUInt* count);
|
|
||||||
HGResult Reset(HGTwainDSImpl* ds);
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void GetIdentity();
|
void GetIdentity();
|
||||||
|
@ -65,10 +33,39 @@ 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;
|
||||||
HGDSEventFunc m_dsEventFunc;
|
|
||||||
HGPointer m_dsEventParam;
|
|
||||||
HGBool m_DSMOpen;
|
HGBool m_DSMOpen;
|
||||||
std::vector<HGTwainDSImpl> m_DSList;
|
std::vector<class HGTwainDSImpl *> m_vpDSImpl;
|
||||||
|
};
|
||||||
|
|
||||||
|
class HGTwainDSImpl
|
||||||
|
{
|
||||||
|
friend class HGTwainDSMImpl;
|
||||||
|
public:
|
||||||
|
HGTwainDSImpl(HGTwainDSMImpl* dsmImpl, const TW_IDENTITY *iden);
|
||||||
|
~HGTwainDSImpl();
|
||||||
|
|
||||||
|
public:
|
||||||
|
HGResult GetName(HGChar* name, HGUInt maxLen);
|
||||||
|
HGResult Open();
|
||||||
|
HGResult Close();
|
||||||
|
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();
|
||||||
|
|
||||||
|
private:
|
||||||
|
HGTwainDSMImpl* m_dsmImpl;
|
||||||
|
TW_IDENTITY m_iden;
|
||||||
|
HGBool m_open;
|
||||||
|
HGBool m_showUI;
|
||||||
|
HWND m_parent;
|
||||||
|
HGDSEventFunc m_eventFunc;
|
||||||
|
HGPointer m_eventParam;
|
||||||
|
HGBool m_enable;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif /* __HGTWAINIMPL_HPP__ */
|
#endif /* __HGTWAINIMPL_HPP__ */
|
Loading…
Reference in New Issue