Compare commits

...

2 Commits

Author SHA1 Message Date
luoliangyi 2e41e33a44 HGSaneUI中实现选择设备和扫描对话框 2023-03-29 18:04:59 +08:00
luoliangyi f75c49dff4 添加sane和twain标准调用测试工程 2023-03-29 16:16:19 +08:00
29 changed files with 826 additions and 152 deletions

View File

@ -1,7 +1,6 @@
#include "device_user.h"
#include <QMessageBox>
#ifdef HG_CMP_MSC
#if 0
DeviceUserMgr::DeviceUserMgr(QWidget *wnd)
{
@ -37,6 +36,13 @@ DeviceUser::~DeviceUser()
m_twainDS = nullptr;
}
QString DeviceUser::GetName()
{
HGChar devName[256];
HGTwain_GetDSName(m_twainDS, devName, 256);
return QString(devName);
}
HGResult DeviceUser::ShowSettingDlg()
{
return HGTwain_EnableDSUIOnly(m_twainDS, (HWND)m_wnd->winId(), DSCloseReqFunc, this);
@ -56,12 +62,7 @@ void HGAPI DeviceUser::DSCloseReqFunc(HGTwainDS ds, HGPointer param)
void HGAPI DeviceUser::DSImageFunc(HGTwainDS ds, HGImage image, HGPointer param)
{
DeviceUser* p = (DeviceUser*)param;
HGImage image2 = nullptr;
HGBase_CloneImage(image, 0, 0, &image2);
if (nullptr != image2)
{
emit p->newImage(image2);
}
emit p->newImage(image);
}
#else
@ -81,11 +82,15 @@ DeviceUserMgr::~DeviceUserMgr()
class DeviceUser* DeviceUserMgr::OpenDeviceUser()
{
Dialog_Device_Select dlg(m_saneMgr, m_wnd);
if (!dlg.exec())
HGSaneDevice dev = nullptr;
#ifdef HG_CMP_MSC
HGSane_OpenSelectedDevice(m_saneMgr, (HWND)m_wnd->winId(), &dev);
#else
HGSane_OpenSelectedDevice(m_saneMgr, m_wnd, &dev);
#endif
if (nullptr == dev)
return nullptr;
return new DeviceUser(m_wnd, dlg.getSaneDevice());
return new DeviceUser(m_wnd, dev);
}
DeviceUser::DeviceUser(QWidget *wnd, HGSaneDevice dev)
@ -100,6 +105,13 @@ DeviceUser::~DeviceUser()
m_saneDev = nullptr;
}
QString DeviceUser::GetName()
{
HGChar devName[256];
HGSane_GetDeviceName(m_saneDev, devName, 256);
return QString(devName);
}
HGResult DeviceUser::ShowSettingDlg()
{
#ifdef HG_CMP_MSC
@ -111,16 +123,17 @@ HGResult DeviceUser::ShowSettingDlg()
HGResult DeviceUser::StartScan()
{
Dialog_Device_Scan dlg(m_saneDev, m_wnd);
connect(&dlg, SIGNAL(newImage(void *)), this, SLOT(on_newImage(void *)), Qt::QueuedConnection);
dlg.exec();
disconnect(&dlg, SIGNAL(newImage(void *)), this, SLOT(on_newImage(void *)));
return HGBASE_ERR_OK;
#ifdef HG_CMP_MSC
return HGSane_StartDeviceWithUI(m_saneDev, (HWND)m_wnd->winId(), DeviceImageFunc, this);
#else
return HGSane_StartDeviceWithUI(m_saneDev, m_wnd, DeviceImageFunc, this);
#endif
}
void DeviceUser::on_newImage(void *image)
void HGAPI DeviceUser::DeviceImageFunc(HGSaneDevice dev, HGImage image, HGPointer param)
{
emit newImage(image);
DeviceUser* p = (DeviceUser*)param;
emit p->newImage(image);
}
#endif

View File

@ -4,7 +4,7 @@
#include "base/HGDef.h"
#include <QDialog>
#ifdef HG_CMP_MSC
#if 0
#include "twain_user/HGTwain.h"
class DeviceUserMgr : public QObject
@ -32,6 +32,8 @@ class DeviceUser : public QObject
public:
~DeviceUser();
// 获取设备名字
QString GetName();
// 弹出配置对话框
HGResult ShowSettingDlg();
// 弹出扫描对话框
@ -77,17 +79,19 @@ class DeviceUser : public QObject
public:
~DeviceUser();
// 获取设备名字
QString GetName();
// 弹出配置对话框
HGResult ShowSettingDlg();
// 弹出扫描对话框
HGResult StartScan();
private:
static void HGAPI DeviceImageFunc(HGSaneDevice dev, HGImage image, HGPointer param);
signals:
void newImage(void *image);
private slots:
void on_newImage(void *image);
private:
QWidget *m_wnd;
HGSaneDevice m_saneDev;

11
app/demo/main.cpp Normal file
View File

@ -0,0 +1,11 @@
#include "mainwindow.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();
return a.exec();
}

69
app/demo/mainwindow.cpp Normal file
View File

@ -0,0 +1,69 @@
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "imgfmt/HGImgFmt.h"
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
m_devUserMgr = new DeviceUserMgr(this);
m_devUser = nullptr;
ui->label_currDevName->setText(QString::fromLocal8Bit("no dev"));
}
MainWindow::~MainWindow()
{
if (nullptr != m_devUser)
{
disconnect(m_devUser, SIGNAL(newImage(void*)), this, SLOT(on_newImage(void*)));
delete m_devUser;
m_devUser = nullptr;
ui->label_currDevName->setText(QString::fromLocal8Bit("no dev"));
}
delete m_devUserMgr;
m_devUserMgr = nullptr;
delete ui;
}
void MainWindow::on_newImage(void *image)
{
static int i = 0;
char fileName[256];
sprintf(fileName, "D:\\test_%d.jpg", i++);
HGImgFmt_SaveImage((HGImage)image, 0, NULL, fileName);
}
void MainWindow::on_pushButton_selectDev_clicked()
{
if (nullptr != m_devUser)
{
disconnect(m_devUser, SIGNAL(newImage(void*)), this, SLOT(on_newImage(void*)));
delete m_devUser;
m_devUser = nullptr;
ui->label_currDevName->setText(QString::fromLocal8Bit("no dev"));
}
DeviceUser *devUser = m_devUserMgr->OpenDeviceUser();
if (devUser != nullptr)
{
m_devUser = devUser;
connect(m_devUser, SIGNAL(newImage(void*)), this, SLOT(on_newImage(void*)));
ui->label_currDevName->setText(m_devUser->GetName());
}
}
void MainWindow::on_pushButton_setting_clicked()
{
if (nullptr != m_devUser)
m_devUser->ShowSettingDlg();
}
void MainWindow::on_pushButton_scan_clicked()
{
if (nullptr != m_devUser)
m_devUser->StartScan();
}

33
app/demo/mainwindow.h Normal file
View File

@ -0,0 +1,33 @@
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include "device_user.h"
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
private slots:
void on_newImage(void *image);
void on_pushButton_selectDev_clicked();
void on_pushButton_setting_clicked();
void on_pushButton_scan_clicked();
private:
Ui::MainWindow *ui;
DeviceUserMgr *m_devUserMgr;
DeviceUser *m_devUser;
};
#endif // MAINWINDOW_H

97
app/demo/mainwindow.ui Normal file
View File

@ -0,0 +1,97 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>MainWindow</class>
<widget class="QMainWindow" name="MainWindow">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>800</width>
<height>600</height>
</rect>
</property>
<property name="windowTitle">
<string>MainWindow</string>
</property>
<widget class="QWidget" name="centralwidget">
<widget class="QLabel" name="label">
<property name="geometry">
<rect>
<x>60</x>
<y>40</y>
<width>91</width>
<height>31</height>
</rect>
</property>
<property name="text">
<string>当前设备名:</string>
</property>
</widget>
<widget class="QLabel" name="label_currDevName">
<property name="geometry">
<rect>
<x>170</x>
<y>50</y>
<width>281</width>
<height>16</height>
</rect>
</property>
<property name="text">
<string/>
</property>
</widget>
<widget class="QPushButton" name="pushButton_selectDev">
<property name="geometry">
<rect>
<x>60</x>
<y>170</y>
<width>131</width>
<height>51</height>
</rect>
</property>
<property name="text">
<string>选择设备</string>
</property>
</widget>
<widget class="QPushButton" name="pushButton_setting">
<property name="geometry">
<rect>
<x>240</x>
<y>170</y>
<width>131</width>
<height>51</height>
</rect>
</property>
<property name="text">
<string>设置参数</string>
</property>
</widget>
<widget class="QPushButton" name="pushButton_scan">
<property name="geometry">
<rect>
<x>420</x>
<y>170</y>
<width>131</width>
<height>51</height>
</rect>
</property>
<property name="text">
<string>开始扫描</string>
</property>
</widget>
</widget>
<widget class="QMenuBar" name="menubar">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>800</width>
<height>22</height>
</rect>
</property>
</widget>
<widget class="QStatusBar" name="statusbar"/>
</widget>
<resources/>
<connections/>
</ui>

View File

@ -0,0 +1,116 @@
QT += core gui
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
CONFIG += c++11
# The following define makes your compiler emit warnings if you use
# any Qt feature that has been marked deprecated (the exact warnings
# depend on your compiler). Please consult the documentation of the
# deprecated API in order to know how to port your code away from it.
DEFINES += QT_DEPRECATED_WARNINGS
# You can also make your code fail to compile if it uses deprecated APIs.
# In order to do so, uncomment the following line.
# You can also select to disable deprecated APIs only up to a certain version of Qt.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0
win32 {
DEFINES += _CRT_SECURE_NO_WARNINGS
LIBS += -ladvapi32
if (contains(DEFINES, OEM_HANWANG) || contains(DEFINES, OEM_LISICHENG) || contains(DEFINES, OEM_CANGTIAN) || contains(DEFINES, OEM_ZHONGJING) || contains(DEFINES, OEM_ZIGUANG)) {
contains(DEFINES, OEM_HANWANG) {
LIBS += -lHWBase -lHWImgFmt -lHWImgProc -lHWSaneUser -lHWTwainUser
contains(QT_ARCH, i386) {
LIBS += -L../../../../sdk/lib/win/x86/OEM/hanvon -llang
}
contains(QT_ARCH, x86_64){
LIBS += -L../../../../sdk/lib/win/x64/OEM/hanvon -llang
}
}
contains(DEFINES, OEM_LISICHENG) {
LIBS += -lLSCBase -lLSCImgFmt -lLSCImgProc -lLSCSaneUser -lLSCTwainUser
contains(QT_ARCH, i386) {
LIBS += -L../../../../sdk/lib/win/x86/OEM/lanxum -llang
}
contains(QT_ARCH, x86_64){
LIBS += -L../../../../sdk/lib/win/x64/OEM/lanxum -llang
}
}
contains(DEFINES, OEM_CANGTIAN) {
LIBS += -lCTSBase -lCTSImgFmt -lCTSImgProc -lCTSSaneUser -lCTSTwainUser
contains(QT_ARCH, i386) {
LIBS += -L../../../../sdk/lib/win/x86/OEM/cumtenn -llang
}
contains(QT_ARCH, x86_64){
LIBS += -L../../../../sdk/lib/win/x64/OEM/cumtenn -llang
}
}
contains(DEFINES, OEM_ZHONGJING) {
LIBS += -lZJBase -lZJImgFmt -lZJImgProc -lZJSaneUser -lZJTwainUser
contains(QT_ARCH, i386) {
LIBS += -L../../../../sdk/lib/win/x86/OEM/microtek -llang
}
contains(QT_ARCH, x86_64){
LIBS += -L../../../../sdk/lib/win/x64/OEM/microtek -llang
}
}
contains(DEFINES, OEM_ZIGUANG) {
LIBS += -lZGBase -lZGImgFmt -lZGImgProc -lZGSaneUser -lZGTwainUser
contains(QT_ARCH, i386) {
LIBS += -L../../../../sdk/lib/win/x86/OEM/unis -llang
}
contains(QT_ARCH, x86_64){
LIBS += -L../../../../sdk/lib/win/x64/OEM/unis -llang
}
}
} else {
LIBS += -lHGBase -lHGImgFmt -lHGImgProc -lHGSaneUser -lHGTwainUser
contains(QT_ARCH, i386) {
LIBS += -L../../../../sdk/lib/win/x86/OEM/huagao -llang
}
contains(QT_ARCH, x86_64){
LIBS += -L../../../../sdk/lib/win/x64/OEM/huagao -llang
}
}
contains(QT_ARCH, i386) {
LIBS += -L../../../../sdk/lib/win/x86/Release
CONFIG(release, debug|release) {
DESTDIR = ../../../../release/win/x86/Release/
}
CONFIG(debug, debug|release) {
}
}
contains(QT_ARCH, x86_64){
LIBS += -L../../../../sdk/lib/win/x64/Release
CONFIG(release, debug|release) {
DESTDIR = ../../../../release/win/x64/Release/
}
CONFIG(debug, debug|release) {
}
}
}
INCLUDEPATH += $$PWD/../../../app/demo/
INCLUDEPATH += $$PWD/../../../utility/
INCLUDEPATH += $$PWD/../../../modules/
INCLUDEPATH += $$PWD/../../../../sdk/include/
SOURCES += \
../../../app/demo/device_user.cpp \
../../../app/demo/main.cpp \
../../../app/demo/mainwindow.cpp
HEADERS += \
../../../app/demo/device_user.h \
../../../app/demo/mainwindow.h
FORMS += \
../../../app/demo/mainwindow.ui
# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target

View File

@ -0,0 +1,7 @@
LIBRARY
EXPORTS
show_devlist_ui
show_setting_ui
show_scan_ui

View File

@ -42,6 +42,7 @@ if (contains(DEFINES, OEM_HANWANG) || contains(DEFINES, OEM_LISICHENG) || contai
}
win32 {
DEF_FILE = HGSaneUI.def
DEFINES += _CRT_SECURE_NO_WARNINGS
LIBS += -ladvapi32
@ -120,6 +121,8 @@ win32 {
}
unix {
CONFIG += unversioned_libname unversioned_soname
LIBS += -llang
QMAKE_LFLAGS += -static-libstdc++ -static-libgcc
DISTRIBUTION = $$system(cat /etc/issue | cut -d\' \' -f1)

View File

@ -0,0 +1,5 @@
TEMPLATE = subdirs
SUBDIRS += \
HGSaneUI \
HGDemo

View File

@ -5,10 +5,11 @@ EXPORTS
HGSane_CreateManager
HGSane_DestroyManager
HGSane_GetDeviceCount
HGSane_GetDeviceName
HGSane_GetDeviceNameWithIndex
HGSane_OpenDevice
HGSane_OpenSelectedDevice
HGSane_CloseDevice
HGSane_GetDeviceName
HGSane_ShowDeviceSettingDlg
HGSane_StartDevice
HGSane_StopDevice

View File

@ -192,11 +192,10 @@ void CHGTestDlg::OnBnClickedButton1()
return;
}
HGChar errInfo[256];
HGSane_OpenDevice(m_saneMgr, 0, &m_saneDev, errInfo, 256);
HGSane_OpenSelectedDevice(m_saneMgr, m_hWnd, &m_saneDev);
if (NULL != m_saneDev)
{
HGResult ret = HGSane_StartDevice(m_saneDev, DeviceEventFunc, this, DeviceImageFunc, this, errInfo, 256);
HGResult ret = HGSane_StartDeviceWithUI(m_saneDev, m_hWnd, DeviceImageFunc, this);
if (HGBASE_ERR_OK != ret)
{
HGSane_CloseDevice(m_saneDev);
@ -235,11 +234,6 @@ void CHGTestDlg::OnBnClickedButton2()
}
#ifdef USE_SANE
void HGAPI CHGTestDlg::DeviceEventFunc(HGSaneDevice dev, HGUInt error, const HGChar* errInfo, HGPointer param)
{
CHGTestDlg* p = (CHGTestDlg*)param;
::PostMessage(p->m_hWnd, 2000, 0, 0);
}
void HGAPI CHGTestDlg::DeviceImageFunc(HGSaneDevice dev, HGImage image, HGPointer param)
{
CHGTestDlg* p = (CHGTestDlg*)param;
@ -273,24 +267,3 @@ void HGAPI CHGTestDlg::DSImageFunc(HGTwainDS ds, HGImage image, HGPointer param)
HGImgFmt_SaveImage(image, 0, NULL, strName);
}
#endif
LRESULT CHGTestDlg::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
#ifdef USE_SANE
if (2000 == message)
{
HGSane_CloseDevice(m_saneDev);
m_saneDev = NULL;
}
else if (2001 == message)
{
HGImage image = (HGImage)wParam;
CStringA strName;
strName.Format("D:\\HGTest_%u.jpg", m_idx++);
HGImgFmt_SaveImage(image, 0, NULL, strName);
HGBase_DestroyImage(image);
}
#endif
return CDialogEx::WindowProc(message, wParam, lParam);
}

View File

@ -4,7 +4,7 @@
#pragma once
//#define USE_SANE
#define USE_SANE
// CHGTestDlg 对话框
class CHGTestDlg : public CDialogEx
@ -25,7 +25,6 @@ protected:
#ifdef USE_SANE
HGSaneManager m_saneMgr;
HGSaneDevice m_saneDev;
static void HGAPI DeviceEventFunc(HGSaneDevice dev, HGUInt error, const HGChar* errInfo, HGPointer param);
static void HGAPI DeviceImageFunc(HGSaneDevice dev, HGImage image, HGPointer param);
#else
HGTwainDSM m_dsm;
@ -48,5 +47,4 @@ protected:
public:
afx_msg void OnBnClickedButton1();
afx_msg void OnBnClickedButton2();
virtual LRESULT WindowProc(UINT message, WPARAM wParam, LPARAM lParam);
};

View File

@ -5,11 +5,12 @@ EXPORTS
HGTwain_CreateDSM
HGTwain_DestroyDSM
HGTwain_GetDSCount
HGTwain_GetDSName
HGTwain_GetDSNameWithIndex
HGTwain_OpenDS
HGTwain_OpenDefaultDS
HGTwain_OpenSelectedDS
HGTwain_CloseDS
HGTwain_GetDSName
HGTwain_EnableDSUIOnly
HGTwain_EnableDS
HGTwain_DisableDS

View File

@ -49,7 +49,7 @@ HGResult HGAPI HGSane_GetDeviceCount(HGSaneManager mgr, HGUInt* count)
return saneManagerImpl->GetDeviceCount(count);
}
HGResult HGAPI HGSane_GetDeviceName(HGSaneManager mgr, HGUInt index, HGChar* name, HGUInt maxLen)
HGResult HGAPI HGSane_GetDeviceNameWithIndex(HGSaneManager mgr, HGUInt index, HGChar* name, HGUInt maxLen)
{
if (NULL == mgr)
{
@ -109,6 +109,17 @@ HGResult HGAPI HGSane_CloseDevice(HGSaneDevice dev)
return saneDeviceImpl->Close();
}
HGResult HGAPI HGSane_GetDeviceName(HGSaneDevice dev, HGChar* name, HGUInt maxLen)
{
if (NULL == dev)
{
return HGBASE_ERR_INVALIDARG;
}
HGSaneDeviceImpl* saneDeviceImpl = (HGSaneDeviceImpl*)dev;
return saneDeviceImpl->GetName(name, maxLen);
}
HGResult HGAPI HGSane_ShowDeviceSettingDlg(HGSaneDevice dev, HGWindow parent)
{
if (NULL == dev)

View File

@ -20,7 +20,7 @@ HGEXPORT HGResult HGAPI HGSane_DestroyManager(HGSaneManager mgr);
HGEXPORT HGResult HGAPI HGSane_GetDeviceCount(HGSaneManager mgr, HGUInt *count);
HGEXPORT HGResult HGAPI HGSane_GetDeviceName(HGSaneManager mgr, HGUInt index, HGChar *name, HGUInt maxLen);
HGEXPORT HGResult HGAPI HGSane_GetDeviceNameWithIndex(HGSaneManager mgr, HGUInt index, HGChar *name, HGUInt maxLen);
HGEXPORT HGResult HGAPI HGSane_OpenDevice(HGSaneManager mgr, HGUInt index, HGSaneDevice *dev, HGChar *errInfo, HGUInt errInfoLen);
@ -28,6 +28,8 @@ HGEXPORT HGResult HGAPI HGSane_OpenSelectedDevice(HGSaneManager mgr, HGWindow pa
HGEXPORT HGResult HGAPI HGSane_CloseDevice(HGSaneDevice dev);
HGEXPORT HGResult HGAPI HGSane_GetDeviceName(HGSaneDevice dev, HGChar* name, HGUInt maxLen);
HGEXPORT HGResult HGAPI HGSane_ShowDeviceSettingDlg(HGSaneDevice dev, HGWindow parent);
HGEXPORT HGResult HGAPI HGSane_StartDevice(HGSaneDevice dev, HGSane_DeviceEventFunc eventFunc, HGPointer eventParam,

View File

@ -1,6 +1,5 @@
#include "HGSaneImpl.hpp"
#include "../base/HGInc.h"
#include <string>
HGSaneManagerImpl::HGSaneManagerImpl()
{
@ -20,7 +19,7 @@ HGSaneManagerImpl::HGSaneManagerImpl()
m_f_sane_control_option = NULL;
memset(&m_saneApi, 0, sizeof(SANEAPI));
m_saneDlgDll = NULL;
m_saneUIDll = NULL;
m_f_show_devlist_ui = NULL;
m_f_show_setting_ui = NULL;
m_f_show_scan_ui = NULL;
@ -49,18 +48,18 @@ HGResult HGSaneManagerImpl::Create(const HGChar* sanePath)
return ret;
}
HGBase_CreateDll("HGSaneUI.dll", &m_saneDlgDll);
if (NULL != m_saneDlgDll)
HGBase_CreateDll("HGSaneUI.dll", &m_saneUIDll);
if (NULL != m_saneUIDll)
{
HGBase_GetDllProcAddress(m_saneDlgDll, "show_devlist_ui", (HGPointer*)&m_f_show_devlist_ui);
HGBase_GetDllProcAddress(m_saneDlgDll, "show_setting_ui", (HGPointer*)&m_f_show_setting_ui);
HGBase_GetDllProcAddress(m_saneDlgDll, "show_scan_ui", (HGPointer*)&m_f_show_scan_ui);
HGBase_GetDllProcAddress(m_saneUIDll, "show_devlist_ui", (HGPointer*)&m_f_show_devlist_ui);
HGBase_GetDllProcAddress(m_saneUIDll, "show_setting_ui", (HGPointer*)&m_f_show_setting_ui);
HGBase_GetDllProcAddress(m_saneUIDll, "show_scan_ui", (HGPointer*)&m_f_show_scan_ui);
}
if (SANE_STATUS_GOOD != m_f_sane_init(NULL, NULL))
{
HGBase_DestroyDll(m_saneDlgDll);
m_saneDlgDll = NULL;
HGBase_DestroyDll(m_saneUIDll);
m_saneUIDll = NULL;
HGBase_DestroyDll(m_dll);
m_dll = NULL;
return HGSANE_ERR_FAIL;
@ -80,8 +79,8 @@ HGResult HGSaneManagerImpl::Destroy()
m_f_sane_exit();
HGBase_DestroyDll(m_saneDlgDll);
m_saneDlgDll = NULL;
HGBase_DestroyDll(m_saneUIDll);
m_saneUIDll = NULL;
HGBase_DestroyDll(m_dll);
m_dll = NULL;
return HGBASE_ERR_OK;
@ -183,14 +182,20 @@ HGResult HGSaneManagerImpl::OpenSelectedDevice(HGWindow parent, class HGSaneDevi
return HGBASE_ERR_FAIL;
}
SANE_Handle handle = m_f_show_devlist_ui(&m_saneApi, parent);
SANE_Handle handle = NULL;
char devName[256] = {0};
if (-2 == m_f_show_devlist_ui(&m_saneApi, parent, &handle, devName, 256))
{
return HGBASE_ERR_NOTSUPPORT;
}
if (NULL == handle)
{
return HGSANE_ERR_FAIL;
}
HGSaneDeviceImpl* newDeviceImpl = new HGSaneDeviceImpl(this);
HGResult ret = newDeviceImpl->Init(handle);
HGResult ret = newDeviceImpl->Init(devName, handle);
if (HGBASE_ERR_OK != ret)
{
delete newDeviceImpl;
@ -294,6 +299,7 @@ void HGSaneManagerImpl::RemoveDevice(class HGSaneDeviceImpl* deviceImpl)
HGSaneDeviceImpl::HGSaneDeviceImpl(HGSaneManagerImpl* mgrImpl)
{
m_mgrImpl = mgrImpl;
m_devName.clear();
m_devHandle = NULL;
m_buffer = NULL;
m_bufferSize = 0;
@ -311,10 +317,16 @@ HGSaneDeviceImpl::~HGSaneDeviceImpl()
}
HGResult HGSaneDeviceImpl::Init(SANE_Handle handle)
HGResult HGSaneDeviceImpl::Init(const HGChar* devName, SANE_Handle handle)
{
assert(NULL == m_devHandle);
if (NULL == devName || NULL == handle)
{
return HGBASE_ERR_INVALIDARG;
}
m_devName = devName;
m_mgrImpl->m_f_sane_set_io_mode(handle, SANE_FALSE);
m_devHandle = handle;
return HGBASE_ERR_OK;
@ -345,6 +357,7 @@ HGResult HGSaneDeviceImpl::Open(const HGChar* devName, HGChar* errInfo, HGUInt e
return HGSANE_ERR_FAIL;
}
m_devName = devName;
m_mgrImpl->m_f_sane_set_io_mode(handle, SANE_FALSE);
m_devHandle = handle;
return HGBASE_ERR_OK;
@ -357,10 +370,24 @@ HGResult HGSaneDeviceImpl::Close()
Stop();
m_mgrImpl->m_f_sane_close(m_devHandle);
m_devHandle = NULL;
m_devName.clear();
m_mgrImpl->RemoveDevice(this);
return HGBASE_ERR_OK;
}
HGResult HGSaneDeviceImpl::GetName(HGChar* name, HGUInt maxLen)
{
if (NULL == name || 0 == maxLen)
{
return HGBASE_ERR_INVALIDARG;
}
if (maxLen < m_devName.size() + 1)
return HGBASE_ERR_FAIL;
strcpy(name, m_devName.c_str());
return HGBASE_ERR_OK;
}
HGResult HGSaneDeviceImpl::ShowSettingDlg(HGWindow parent)
{
if (NULL != m_thread)
@ -373,7 +400,11 @@ HGResult HGSaneDeviceImpl::ShowSettingDlg(HGWindow parent)
return HGBASE_ERR_FAIL;
}
m_mgrImpl->m_f_show_setting_ui(&m_mgrImpl->m_saneApi, m_devHandle, parent);
if (-2 == m_mgrImpl->m_f_show_setting_ui(&m_mgrImpl->m_saneApi, m_devHandle, parent))
{
return HGBASE_ERR_NOTSUPPORT;
}
return HGBASE_ERR_OK;
}
@ -476,7 +507,12 @@ HGResult HGSaneDeviceImpl::StartWithUI(HGWindow parent, HGSane_DeviceImageFunc i
m_dpi = GetDpi();
m_imageFunc = imageFunc;
m_imageParam = imageParam;
m_mgrImpl->m_f_show_scan_ui(&m_mgrImpl->m_saneApi, m_devHandle, parent, ShowScanImageCallback, this);
if (-2 == m_mgrImpl->m_f_show_scan_ui(&m_mgrImpl->m_saneApi, m_devHandle, parent, ShowScanImageCallback, this))
{
return HGBASE_ERR_NOTSUPPORT;
}
return HGBASE_ERR_OK;
}

View File

@ -9,6 +9,7 @@
#include "sane/sane_ex.h"
#include <list>
#include <vector>
#include <string>
typedef SANE_Status (*f_sane_init)(SANE_Int* version_code, SANE_Auth_Callback authorize);
typedef void (*f_sane_exit)(void);
@ -24,10 +25,10 @@ typedef SANE_Status (*f_sane_get_parameters)(SANE_Handle handle, SANE_Parameters
typedef const SANE_Option_Descriptor* (*f_sane_get_option_descriptor)(SANE_Handle handle, SANE_Int option);
typedef SANE_Status (*f_sane_control_option)(SANE_Handle handle, SANE_Int option, SANE_Action action, void* value, SANE_Int* info);
typedef SANE_Handle (*f_show_devlist_ui)(SANEAPI* saneApi, HGWindow parent);
typedef void (*f_show_setting_ui)(SANEAPI* saneApi, SANE_Handle handle, HGWindow parent);
typedef void (*f_show_scan_ui_image_callback)(const SANE_Parameters *imageFormat, const SANE_Byte *imageData, void * callbackParam);
typedef void (*f_show_scan_ui)(SANEAPI* saneApi, SANE_Handle handle, HGWindow parent, f_show_scan_ui_image_callback callback, void *callbackParam);
typedef void (*f_show_scan_ui_image_callback)(const SANE_Parameters* imageFormat, const SANE_Byte* imageData, void* callbackParam);
typedef int (*f_show_devlist_ui)(SANEAPI* saneApi, HGWindow parent, SANE_Handle *handle, char *devName, unsigned int maxLen);
typedef int (*f_show_setting_ui)(SANEAPI* saneApi, SANE_Handle handle, HGWindow parent);
typedef int (*f_show_scan_ui)(SANEAPI* saneApi, SANE_Handle handle, HGWindow parent, f_show_scan_ui_image_callback callback, void *callbackParam);
class HGSaneManagerImpl
{
@ -64,7 +65,7 @@ private:
f_sane_control_option m_f_sane_control_option;
SANEAPI m_saneApi;
HGDll m_saneDlgDll;
HGDll m_saneUIDll;
f_show_devlist_ui m_f_show_devlist_ui;
f_show_setting_ui m_f_show_setting_ui;
f_show_scan_ui m_f_show_scan_ui;
@ -78,9 +79,10 @@ public:
HGSaneDeviceImpl(HGSaneManagerImpl* mgrImpl);
~HGSaneDeviceImpl();
HGResult Init(SANE_Handle handle);
HGResult Init(const HGChar* devName, SANE_Handle handle);
HGResult Open(const HGChar *devName, HGChar* errInfo, HGUInt errInfoLen);
HGResult Close();
HGResult GetName(HGChar* name, HGUInt maxLen);
HGResult ShowSettingDlg(HGWindow parent);
HGResult Start(HGSane_DeviceEventFunc eventFunc, HGPointer eventParam,
HGSane_DeviceImageFunc imageFunc, HGPointer imageParam, HGChar* errInfo, HGUInt errInfoLen);
@ -94,6 +96,7 @@ private:
private:
HGSaneManagerImpl* m_mgrImpl;
std::string m_devName;
SANE_Handle m_devHandle;
HGByte* m_buffer;
HGInt m_bufferSize;

View File

@ -1,16 +1,92 @@
#include "HGSaneUI.h"
#include "dialog_device_select.h"
#include "dialog_device_scan.h"
#include <QApplication>
SANE_Handle show_devlist_ui(SANEAPI* saneApi, HGWindow parent)
int show_devlist_ui(SANEAPI* saneApi, HGWindow parent, SANE_Handle *handle, char *devName, unsigned int maxLen)
{
return nullptr;
if (nullptr == saneApi || nullptr == handle)
return -1;
if (nullptr == qApp)
{
#ifdef HG_CMP_MSC
// 创建WIN32窗口
return -2;
#else
return -2;
#endif
}
QWidget *qParent = nullptr;
#ifdef HG_CMP_MSC
qParent = QWidget::find((WId)parent);
if (nullptr != parent && nullptr == qParent)
return -2;
#else
qParent = parent;
#endif
*handle = nullptr;
Dialog_Device_Select dlg(saneApi, qParent);
if (dlg.exec())
{
if (nullptr != devName)
{
std::string strDevName = dlg.GetDevName();
if (maxLen >= strDevName.size() + 1)
strcpy(devName, strDevName.c_str());
}
*handle = dlg.GetDevHandle();
}
return 0;
}
void show_setting_ui(SANEAPI* saneApi, SANE_Handle handle, HGWindow parent)
int show_setting_ui(SANEAPI* saneApi, SANE_Handle handle, HGWindow parent)
{
if (nullptr == saneApi || nullptr == handle)
return -1;
if (nullptr == qApp)
{
#ifdef HG_CMP_MSC
// 创建WIN32窗口
return -2;
#else
return -2;
#endif
}
return 0;
}
void show_scan_ui(SANEAPI* saneApi, SANE_Handle handle, HGWindow parent, show_scan_ui_image_callback callback, void *callbackParam)
int show_scan_ui(SANEAPI* saneApi, SANE_Handle handle, HGWindow parent, show_scan_ui_image_callback callback, void *callbackParam)
{
if (nullptr == saneApi || nullptr == handle)
return -1;
if (nullptr == qApp)
{
#ifdef HG_CMP_MSC
// 创建WIN32窗口
return -2;
#else
return -2;
#endif
}
QWidget *qParent = nullptr;
#ifdef HG_CMP_MSC
qParent = QWidget::find((WId)parent);
if (nullptr != parent && nullptr == qParent)
return -2;
#else
qParent = parent;
#endif
Dialog_Device_Scan dlg(saneApi, handle, callback, callbackParam, qParent);
dlg.exec();
return 0;
}

View File

@ -1,13 +1,13 @@
#ifndef SANE_UI_H
#define SANE_UI_H
#include "base/HGDef.h"
#include "../base/HGDef.h"
#include "sane/sane_ex.h"
typedef void (*show_scan_ui_image_callback)(const SANE_Parameters *imageFormat, const SANE_Byte *imageData, void * callbackParam);
HGEXPORT SANE_Handle show_devlist_ui(SANEAPI* saneApi, HGWindow parent);
HGEXPORT void show_setting_ui(SANEAPI* saneApi, SANE_Handle handle, HGWindow parent);
HGEXPORT void show_scan_ui(SANEAPI* saneApi, SANE_Handle handle, HGWindow parent, show_scan_ui_image_callback callback, void *callbackParam);
HGEXPORT int show_devlist_ui(SANEAPI* saneApi, HGWindow parent, SANE_Handle *handle, char *devName, unsigned int maxLen);
HGEXPORT int show_setting_ui(SANEAPI* saneApi, SANE_Handle handle, HGWindow parent);
HGEXPORT int show_scan_ui(SANEAPI* saneApi, SANE_Handle handle, HGWindow parent, show_scan_ui_image_callback callback, void *callbackParam);
#endif

View File

@ -1,18 +1,28 @@
#include "dialog_device_scan.h"
#include "ui_dialog_device_scan.h"
Dialog_Device_Scan::Dialog_Device_Scan(SANE_Handle dev, QWidget *parent) :
Dialog_Device_Scan::Dialog_Device_Scan(SANEAPI* saneApi, SANE_Handle dev,
show_scan_ui_image_callback callback, void *callbackParam, QWidget *parent) :
QDialog(parent),
ui(new Ui::Dialog_Device_Scan)
{
ui->setupUi(this);
memcpy(&m_saneAPI, saneApi, sizeof(SANEAPI));
m_saneDev = dev;
m_callback = callback;
m_callbackParam = callbackParam;
m_buffer = NULL;
m_bufferSize = 0;
m_stopThread = HGFALSE;
m_thread = NULL;
connect(this, SIGNAL(eventFunc(unsigned int, QString)), this, SLOT(on_eventFunc(unsigned int, QString)), Qt::QueuedConnection);
connect(this, SIGNAL(eventFunc(QString)), this, SLOT(on_eventFunc(QString)), Qt::QueuedConnection);
connect(this, SIGNAL(newImage(void *, void *)), this, SLOT(on_newImage(void *, void *)), Qt::QueuedConnection);
ui->pushButton_Continue->setEnabled(false);
ui->pushButton_Continue->setEnabled(true);
ui->pushButton_Cancel->setEnabled(false);
ui->pushButton_Complete->setEnabled(false);
ui->pushButton_Complete->setEnabled(true);
on_pushButton_Continue_clicked();
}
@ -22,14 +32,39 @@ Dialog_Device_Scan::~Dialog_Device_Scan()
delete ui;
}
void Dialog_Device_Scan::on_eventFunc(HGUInt error, QString errInfo)
void Dialog_Device_Scan::on_eventFunc(QString errInfo)
{
ui->label->setText(errInfo);
m_stopThread = HGTRUE;
m_saneAPI.sane_cancel_api(m_saneDev);
HGBase_CloseThread(m_thread);
m_thread = NULL;
free(m_buffer);
m_buffer = NULL;
m_bufferSize = 0;
ui->pushButton_Continue->setEnabled(true);
ui->pushButton_Cancel->setEnabled(false);
ui->pushButton_Complete->setEnabled(true);
}
void Dialog_Device_Scan::on_newImage(void *format, void *data)
{
SANE_Parameters *format2 = (SANE_Parameters *)format;
SANE_Byte *data2 = (HGByte *)data;
if (NULL != m_callback)
m_callback(format2, data2, m_callbackParam);
delete [] data2;
delete format2;
}
void Dialog_Device_Scan::on_pushButton_Cancel_clicked()
{
m_saneAPI.sane_cancel_api(m_saneDev);
}
void Dialog_Device_Scan::on_pushButton_Complete_clicked()
@ -39,5 +74,92 @@ void Dialog_Device_Scan::on_pushButton_Complete_clicked()
void Dialog_Device_Scan::on_pushButton_Continue_clicked()
{
SANE_Parameters params;
memset(&params, 0, sizeof(SANE_Parameters));
SANE_Status stat = m_saneAPI.sane_get_parameters_api(m_saneDev, &params);
assert(SANE_STATUS_GOOD == stat);
m_bufferSize = 5000 * 4000;
m_buffer = (HGByte *)malloc(m_bufferSize);
if (NULL == m_buffer)
{
ui->label->setText(tr("out of memory"));
return;
}
m_stopThread = HGFALSE;
HGBase_OpenThread(ThreadFunc, this, &m_thread);
ui->pushButton_Continue->setEnabled(false);
ui->pushButton_Cancel->setEnabled(true);
ui->pushButton_Complete->setEnabled(false);
ui->label->setText(tr("正在扫描......"));
}
void HGAPI Dialog_Device_Scan::ThreadFunc(HGThread thread, HGPointer param)
{
Dialog_Device_Scan* p = (Dialog_Device_Scan*)param;
SANE_Status stat = p->m_saneAPI.sane_start_api(p->m_saneDev);
if (SANE_STATUS_GOOD != stat)
{
emit p->eventFunc(tr(p->m_saneAPI.sane_strstatus_api(stat)));
return;
}
while (!p->m_stopThread)
{
SANE_Parameters params;
memset(&params, 0, sizeof(SANE_Parameters));
SANE_Status stat1 = p->m_saneAPI.sane_get_parameters_api(p->m_saneDev, &params);
SANE_Int readSize = 0;
SANE_Status stat2 = SANE_STATUS_GOOD;
while (readSize < p->m_bufferSize)
{
SANE_Int len = 0;
stat2 = p->m_saneAPI.sane_read_api(p->m_saneDev, p->m_buffer + readSize, p->m_bufferSize - readSize, &len);
readSize += len;
if (SANE_STATUS_GOOD != stat2)
{
break;
}
}
if (SANE_STATUS_GOOD == stat2)
{
// m_bufferSize空间不够
emit p->eventFunc(tr(p->m_saneAPI.sane_strstatus_api(SANE_STATUS_INVAL)));
break;
}
else if (SANE_STATUS_EOF == stat2)
{
if (0 == readSize)
{
emit p->eventFunc(tr("扫描完成"));
break;
}
else if (SANE_STATUS_GOOD != stat1 || readSize != params.bytes_per_line * params.lines)
{
emit p->eventFunc(tr(p->m_saneAPI.sane_strstatus_api(SANE_STATUS_INVAL)));
break;
}
}
else if (SANE_STATUS_CANCELLED == stat2)
{
break;
}
else
{
emit p->eventFunc(tr(p->m_saneAPI.sane_strstatus_api(stat2)));
break;
}
SANE_Parameters *format = new SANE_Parameters;
memcpy(format, &params, sizeof(SANE_Parameters));
SANE_Byte *data = new HGByte [readSize];
memcpy(data, p->m_buffer, readSize);
emit p->newImage(format, data);
}
}

View File

@ -2,7 +2,9 @@
#define DIALOG_DEVICE_SCAN_H
#include "base/HGDef.h"
#include "base/HGThread.h"
#include "sane/sane_ex.h"
#include "HGSaneUI.h"
#include <QDialog>
namespace Ui {
@ -14,25 +16,34 @@ class Dialog_Device_Scan : public QDialog
Q_OBJECT
public:
explicit Dialog_Device_Scan(SANE_Handle dev, QWidget *parent = nullptr);
Dialog_Device_Scan(SANEAPI* saneApi, SANE_Handle dev,
show_scan_ui_image_callback callback, void *callbackParam, QWidget *parent = nullptr);
~Dialog_Device_Scan();
signals:
void eventFunc(HGUInt error, QString errInfo);
void newImage(void *image);
void eventFunc(QString errInfo);
void newImage(void *format, void *data);
private slots:
void on_eventFunc(HGUInt error, QString errInfo);
void on_eventFunc(QString errInfo);
void on_newImage(void *format, void *data);
void on_pushButton_Cancel_clicked();
void on_pushButton_Complete_clicked();
void on_pushButton_Continue_clicked();
private:
static void HGAPI ThreadFunc(HGThread thread, HGPointer param);
private:
Ui::Dialog_Device_Scan *ui;
SANEAPI m_saneAPI;
SANE_Handle m_saneDev;
show_scan_ui_image_callback m_callback;
void *m_callbackParam;
HGByte* m_buffer;
HGInt m_bufferSize;
volatile HGBool m_stopThread;
HGThread m_thread;
};
#endif // DIALOG_DEVICE_SCAN_H

View File

@ -2,11 +2,32 @@
#include "ui_dialog_device_select.h"
#include <QMessageBox>
Dialog_Device_Select::Dialog_Device_Select(QWidget *parent) :
Dialog_Device_Select::Dialog_Device_Select(SANEAPI* saneApi, QWidget *parent) :
QDialog(parent),
ui(new Ui::Dialog_Device_Select)
{
ui->setupUi(this);
memcpy(&m_saneAPI, saneApi, sizeof(SANEAPI));
m_devHandle = nullptr;
m_devName.clear();
m_vDevName.clear();
const SANE_Device** device_list;
if (SANE_STATUS_GOOD == saneApi->sane_get_devices_api(&device_list, SANE_TRUE))
{
const SANE_Device** p;
for (p = device_list; *p != nullptr; ++p)
{
m_vDevName.push_back((*p)->name);
ui->listWidget->addItem((*p)->name);
}
}
if (!m_vDevName.empty())
{
ui->listWidget->setCurrentRow(0);
}
}
Dialog_Device_Select::~Dialog_Device_Select()
@ -14,7 +35,38 @@ Dialog_Device_Select::~Dialog_Device_Select()
delete ui;
}
void Dialog_Device_Select::on_buttonBox_accepted()
SANE_Handle Dialog_Device_Select::GetDevHandle()
{
return m_devHandle;
}
std::string Dialog_Device_Select::GetDevName()
{
return m_devName;
}
void Dialog_Device_Select::on_pushButton_OK_clicked()
{
int index = ui->listWidget->currentRow();
if (index < 0)
{
return;
}
SANE_Handle dev = nullptr;
SANE_Status ret = m_saneAPI.sane_open_api(m_vDevName[index].c_str(), &dev);
if (SANE_STATUS_GOOD != ret)
{
QMessageBox::information(this, tr("tips"), tr(m_saneAPI.sane_strstatus_api(ret)));
return;
}
m_devHandle = dev;
m_devName = m_vDevName[index];
accept();
}
void Dialog_Device_Select::on_pushButton_Cancel_clicked()
{
reject();
}

View File

@ -4,6 +4,8 @@
#include "base/HGDef.h"
#include "sane/sane_ex.h"
#include <QDialog>
#include <string>
#include <vector>
namespace Ui {
class Dialog_Device_Select;
@ -14,14 +16,23 @@ class Dialog_Device_Select : public QDialog
Q_OBJECT
public:
Dialog_Device_Select(QWidget *parent = nullptr);
Dialog_Device_Select(SANEAPI* saneApi, QWidget *parent = nullptr);
~Dialog_Device_Select();
SANE_Handle GetDevHandle();
std::string GetDevName();
private slots:
void on_buttonBox_accepted();
void on_pushButton_OK_clicked();
void on_pushButton_Cancel_clicked();
private:
Ui::Dialog_Device_Select *ui;
SANEAPI m_saneAPI;
SANE_Handle m_devHandle;
std::string m_devName;
std::vector<std::string> m_vDevName;
};
#endif // DIALOG_DEVICE_SELECT_H

View File

@ -14,54 +14,46 @@
<string>Dialog</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<layout class="QHBoxLayout" name="horizontalLayout_2">
<item>
<widget class="QListWidget" name="listWidget"/>
</item>
</layout>
</item>
<item>
<widget class="QDialogButtonBox" name="buttonBox">
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<spacer name="horizontalSpacer">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="standardButtons">
<set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QPushButton" name="pushButton_OK">
<property name="text">
<string>确定</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="pushButton_Cancel">
<property name="text">
<string>取消</string>
</property>
</widget>
</item>
</layout>
</item>
</layout>
</widget>
<resources/>
<connections>
<connection>
<sender>buttonBox</sender>
<signal>accepted()</signal>
<receiver>Dialog_Device_Select</receiver>
<slot>accept()</slot>
<hints>
<hint type="sourcelabel">
<x>248</x>
<y>254</y>
</hint>
<hint type="destinationlabel">
<x>157</x>
<y>274</y>
</hint>
</hints>
</connection>
<connection>
<sender>buttonBox</sender>
<signal>rejected()</signal>
<receiver>Dialog_Device_Select</receiver>
<slot>reject()</slot>
<hints>
<hint type="sourcelabel">
<x>316</x>
<y>260</y>
</hint>
<hint type="destinationlabel">
<x>286</x>
<y>274</y>
</hint>
</hints>
</connection>
</connections>
<connections/>
</ui>

View File

@ -49,7 +49,7 @@ HGResult HGAPI HGTwain_GetDSCount(HGTwainDSM dsm, HGUInt* count)
return twainDSMImpl->GetDSCount(count);
}
HGResult HGAPI HGTwain_GetDSName(HGTwainDSM dsm, HGUInt index, HGChar* name, HGUInt maxLen)
HGResult HGAPI HGTwain_GetDSNameWithIndex(HGTwainDSM dsm, HGUInt index, HGChar* name, HGUInt maxLen)
{
if (NULL == dsm)
{
@ -128,6 +128,17 @@ HGResult HGAPI HGTwain_CloseDS(HGTwainDS ds)
return twainDSImpl->Close();
}
HGResult HGAPI HGTwain_GetDSName(HGTwainDS ds, HGChar* name, HGUInt maxLen)
{
if (NULL == ds)
{
return HGBASE_ERR_INVALIDARG;
}
HGTwainDSImpl* twainDSImpl = (HGTwainDSImpl*)ds;
return twainDSImpl->GetName(name, maxLen);
}
HGResult HGAPI HGTwain_EnableDSUIOnly(HGTwainDS ds, HWND parent, HGDSCloseReqFunc eventFunc, HGPointer eventParam)
{
if (NULL == ds)

View File

@ -20,7 +20,7 @@ HGEXPORT HGResult HGAPI HGTwain_DestroyDSM(HGTwainDSM dsm);
HGEXPORT HGResult HGAPI HGTwain_GetDSCount(HGTwainDSM dsm, HGUInt* count);
HGEXPORT HGResult HGAPI HGTwain_GetDSName(HGTwainDSM dsm, HGUInt index, HGChar* name, HGUInt maxLen);
HGEXPORT HGResult HGAPI HGTwain_GetDSNameWithIndex(HGTwainDSM dsm, HGUInt index, HGChar* name, HGUInt maxLen);
HGEXPORT HGResult HGAPI HGTwain_OpenDS(HGTwainDSM dsm, HGUInt index, HGTwainDS *ds);
@ -30,6 +30,8 @@ HGEXPORT HGResult HGAPI HGTwain_OpenSelectedDS(HGTwainDSM dsm, HGTwainDS* ds);
HGEXPORT HGResult HGAPI HGTwain_CloseDS(HGTwainDS ds);
HGEXPORT HGResult HGAPI HGTwain_GetDSName(HGTwainDS ds, HGChar* name, HGUInt maxLen);
HGEXPORT HGResult HGAPI HGTwain_EnableDSUIOnly(HGTwainDS ds, HWND parent, HGDSCloseReqFunc eventFunc, HGPointer eventParam);
HGEXPORT HGResult HGAPI HGTwain_EnableDS(HGTwainDS ds, HGBool showUI, HWND parent, HGDSCloseReqFunc eventFunc, HGPointer eventParam,

View File

@ -352,6 +352,19 @@ HGResult HGTwainDSImpl::Close()
return HGBASE_ERR_OK;
}
HGResult HGTwainDSImpl::GetName(HGChar* name, HGUInt maxLen)
{
if (NULL == name || 0 == maxLen)
{
return HGBASE_ERR_INVALIDARG;
}
if (maxLen < strlen(m_iden.ProductName) + 1)
return HGBASE_ERR_FAIL;
strcpy(name, m_iden.ProductName);
return HGBASE_ERR_OK;
}
HGResult HGTwainDSImpl::EnableUIOnly(HWND parent, HGDSCloseReqFunc eventFunc, HGPointer eventParam)
{
if (m_enable)

View File

@ -46,6 +46,7 @@ public:
public:
HGResult Open(const TW_IDENTITY* iden);
HGResult Close();
HGResult GetName(HGChar* name, HGUInt maxLen);
HGResult EnableUIOnly(HWND parent, HGDSCloseReqFunc eventFunc, HGPointer eventParam);
HGResult Enable(HGBool showUI, HWND parent, HGDSCloseReqFunc eventFunc, HGPointer eventParam,
HGDSImageFunc imageFunc, HGPointer imageParam);