完善HGScannerLib的功能

This commit is contained in:
luoliangyi 2022-07-19 17:09:52 +08:00
parent 1f44d5c4d6
commit 42b22b8409
10 changed files with 307 additions and 24 deletions

View File

@ -125,6 +125,7 @@
<PrecompiledHeader>NotUsing</PrecompiledHeader>
<PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile>
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
<AdditionalIncludeDirectories>../../../modules/base/;../../../modules/;../../../utility/;../../../../sdk/include/;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
</ClCompile>
<Link>
<SubSystem>Windows</SubSystem>
@ -133,6 +134,8 @@
<GenerateDebugInformation>true</GenerateDebugInformation>
<EnableUAC>false</EnableUAC>
<ModuleDefinitionFile>HGScannerLib.def</ModuleDefinitionFile>
<AdditionalDependencies>../Release/HGBase.lib;../Release/HGImgFmt.lib;../Release/HGImgProc.lib;../../../../sdk/lib/win/x86/Release/sane.lib;%(AdditionalDependencies)</AdditionalDependencies>
<AdditionalOptions>/LTCG %(AdditionalOptions)</AdditionalOptions>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
@ -144,12 +147,14 @@
<PrecompiledHeader>NotUsing</PrecompiledHeader>
<PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile>
<RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
<AdditionalIncludeDirectories>../../../modules/base/;../../../modules/;../../../utility/;../../../../sdk/include/;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
</ClCompile>
<Link>
<SubSystem>Windows</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation>
<EnableUAC>false</EnableUAC>
<ModuleDefinitionFile>HGScannerLib.def</ModuleDefinitionFile>
<AdditionalDependencies>../x64/Debug/HGBase.lib;../x64/Debug/HGImgFmt.lib;../x64/Debug/HGImgProc.lib;../../../../sdk/lib/win/x64/Release/sane.lib;%(AdditionalDependencies)</AdditionalDependencies>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
@ -163,6 +168,7 @@
<PrecompiledHeader>NotUsing</PrecompiledHeader>
<PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile>
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
<AdditionalIncludeDirectories>../../../modules/base/;../../../modules/;../../../utility/;../../../../sdk/include/;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
</ClCompile>
<Link>
<SubSystem>Windows</SubSystem>
@ -171,6 +177,8 @@
<GenerateDebugInformation>true</GenerateDebugInformation>
<EnableUAC>false</EnableUAC>
<ModuleDefinitionFile>HGScannerLib.def</ModuleDefinitionFile>
<AdditionalDependencies>../x64/Release/HGBase.lib;../x64/Release/HGImgFmt.lib;../x64/Release/HGImgProc.lib;../../../../sdk/lib/win/x64/Release/sane.lib;%(AdditionalDependencies)</AdditionalDependencies>
<AdditionalOptions>/LTCG %(AdditionalOptions)</AdditionalOptions>
</Link>
</ItemDefinitionGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />

View File

@ -12,6 +12,7 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "HGTest", "HGTest\HGTest.vcx
{EFAE5F69-A4C2-4A07-8BE6-68714D86BCE2} = {EFAE5F69-A4C2-4A07-8BE6-68714D86BCE2}
{4954F36B-A0A3-4550-9C4E-3B3D210F5CE4} = {4954F36B-A0A3-4550-9C4E-3B3D210F5CE4}
{5D85F2AC-FACD-436C-A67B-E13056DD0C03} = {5D85F2AC-FACD-436C-A67B-E13056DD0C03}
{62CAD8E9-4461-49A1-8EB8-4CEBE113FE02} = {62CAD8E9-4461-49A1-8EB8-4CEBE113FE02}
{4909ACEA-80FF-482E-9FA2-5E8534789A82} = {4909ACEA-80FF-482E-9FA2-5E8534789A82}
EndProjectSection
EndProject

View File

@ -93,7 +93,7 @@
<SDLCheck>true</SDLCheck>
<PreprocessorDefinitions>WIN32;_WINDOWS;_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile>
<AdditionalIncludeDirectories>../../../modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<AdditionalIncludeDirectories>../../../modules/base/;../../../modules;../../../sdk;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
</ClCompile>
<Link>
<SubSystem>Windows</SubSystem>
@ -116,7 +116,7 @@
<SDLCheck>true</SDLCheck>
<PreprocessorDefinitions>_WINDOWS;_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile>
<AdditionalIncludeDirectories>../../../modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<AdditionalIncludeDirectories>../../../modules/base/;../../../modules;../../../sdk;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
</ClCompile>
<Link>
<SubSystem>Windows</SubSystem>
@ -141,7 +141,7 @@
<SDLCheck>true</SDLCheck>
<PreprocessorDefinitions>WIN32;_WINDOWS;NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile>
<AdditionalIncludeDirectories>../../../modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<AdditionalIncludeDirectories>../../../modules/base/;../../../modules;../../../sdk;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
</ClCompile>
<Link>
<SubSystem>Windows</SubSystem>
@ -169,7 +169,7 @@
<SDLCheck>true</SDLCheck>
<PreprocessorDefinitions>_WINDOWS;NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile>
<AdditionalIncludeDirectories>../../../modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<AdditionalIncludeDirectories>../../../modules/base/;../../../modules;../../../sdk;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
</ClCompile>
<Link>
<SubSystem>Windows</SubSystem>

View File

@ -12,6 +12,7 @@
#pragma comment(lib, "../x64/Debug/HGTwainUser.lib")
#pragma comment(lib, "../x64/Debug/HGSaneUser.lib")
#pragma comment(lib, "../x64/Debug/HGVersion.lib")
#pragma comment(lib, "../x64/Debug/HGScannerLib.lib")
#else
#pragma comment(lib, "../x64/Release/HGBase.lib")
#pragma comment(lib, "../x64/Release/HGImgFmt.lib")
@ -19,6 +20,7 @@
#pragma comment(lib, "../x64/Release/HGTwainUser.lib")
#pragma comment(lib, "../x64/Release/HGSaneUser.lib")
#pragma comment(lib, "../x64/Release/HGVersion.lib")
#pragma comment(lib, "../x64/Release/HGScannerLib.lib")
#endif
#else
#ifdef _DEBUG
@ -28,6 +30,7 @@
#pragma comment(lib, "../Debug/HGTwainUser.lib")
#pragma comment(lib, "../Debug/HGSaneUser.lib")
#pragma comment(lib, "../Debug/HGVersion.lib")
#pragma comment(lib, "../Debug/HGScannerLib.lib")
#else
#pragma comment(lib, "../Release/HGBase.lib")
#pragma comment(lib, "../Release/HGImgFmt.lib")
@ -35,5 +38,6 @@
#pragma comment(lib, "../Release/HGTwainUser.lib")
#pragma comment(lib, "../Release/HGSaneUser.lib")
#pragma comment(lib, "../Release/HGVersion.lib")
#pragma comment(lib, "../Release/HGScannerLib.lib")
#endif
#endif

View File

@ -24,5 +24,6 @@
#include "twain_user/HGTwain.h"
#include "sane_user/HGSane.h"
#include "version/HGVersion.h"
#include "scannerlib/HGScannerLib.h"
#endif //PCH_H

View File

@ -1,6 +1,7 @@
#include "HGLibDeviceImpl.hpp"
#include "base/HGInc.h"
#include "base/HGInfo.h"
#include "base/HGImage.h"
#include "HGString.h"
HGLock HGLibDeviceImpl::m_lock = NULL;
@ -8,10 +9,18 @@ HGLibDeviceHotPlugEventFunc HGLibDeviceImpl::m_hotPlugEventFunc = NULL;
HGPointer HGLibDeviceImpl::m_hotPlugEventParam = NULL;
HGBool HGLibDeviceImpl::m_init = HGFALSE;
std::vector<std::string> HGLibDeviceImpl::m_devNameList;
std::map<SANE_Handle, HGLibDeviceImpl*> HGLibDeviceImpl::m_deviceList;
HGLibDeviceImpl::HGLibDeviceImpl()
{
m_devHandle = NULL;
m_devName.clear();
m_scanning = HGFALSE;
m_scanEvent = NULL;
m_eventFunc = NULL;
m_eventParam = NULL;
m_imageFunc = NULL;
m_imageParam = NULL;
}
HGLibDeviceImpl::~HGLibDeviceImpl()
@ -53,7 +62,13 @@ HGBool HGLibDeviceImpl::Deinit()
return HGFALSE;
}
if (!m_deviceList.empty())
{
return HGFALSE;
}
sane_exit();
m_devNameList.clear();
m_hotPlugEventFunc = NULL;
m_hotPlugEventParam = NULL;
HGBase_DestroyLock(m_lock);
@ -64,7 +79,23 @@ HGBool HGLibDeviceImpl::Deinit()
HGChar** HGLibDeviceImpl::GetNameList()
{
return NULL;
HGChar** nameList = NULL;
HGBase_EnterLock(m_lock);
nameList = (HGChar **)malloc((m_devNameList.size() + 1) * sizeof(HGChar *));
if (NULL != nameList)
{
nameList[m_devNameList.size()] = NULL;
for (int i = 0; i < (int)m_devNameList.size(); ++i)
{
nameList[i] = (HGChar *)malloc(m_devNameList[i].size() + 1);
if (NULL != nameList[i])
strcpy(nameList[i], m_devNameList[i].c_str());
}
}
HGBase_LeaveLock(m_lock);
return nameList;
}
HGBool HGLibDeviceImpl::ReleaseNameList(HGChar** deviceName)
@ -74,16 +105,131 @@ HGBool HGLibDeviceImpl::ReleaseNameList(HGChar** deviceName)
return HGFALSE;
}
while (0 != *deviceName)
HGChar** p = deviceName;
while (0 != *p)
{
free(*deviceName);
++deviceName;
free(*p);
++p;
}
free(deviceName);
return HGTRUE;
}
HGLibDeviceImpl* HGLibDeviceImpl::Open(const HGChar* deviceName)
{
SANE_Handle devHandle = NULL;
sane_open(deviceName, &devHandle);
if (NULL == devHandle)
{
return NULL;
}
HGLibDeviceImpl* deviceImpl = new HGLibDeviceImpl;
deviceImpl->m_devHandle = devHandle;
deviceImpl->m_devName = deviceName;
m_deviceList[devHandle] = deviceImpl;
return deviceImpl;
}
HGBool HGLibDeviceImpl::Close()
{
assert(NULL != m_devHandle);
assert(!m_devName.empty());
StopScan();
sane_close(m_devHandle);
m_devHandle = NULL;
m_devName.clear();
std::map<SANE_Handle, HGLibDeviceImpl*>::iterator iter;
for (iter = m_deviceList.begin(); iter != m_deviceList.end(); ++iter)
{
if (iter->second == this)
{
m_deviceList.erase(iter);
break;
}
}
delete this;
return HGTRUE;
}
HGBool HGLibDeviceImpl::SetParam(const HGLibDeviceSetParam* param, HGUInt count)
{
return HGFALSE;
}
HGLibDeviceGetParamGroup* HGLibDeviceImpl::GetParamGroupList(HGUInt* count)
{
return NULL;
}
HGBool HGLibDeviceImpl::ReleaseParamGroupList(HGLibDeviceGetParamGroup* paramGroup, HGUInt count)
{
return HGFALSE;
}
HGBool HGLibDeviceImpl::ResetParam()
{
return HGFALSE;
}
HGBool HGLibDeviceImpl::StartScan(HGLibDeviceScanEventFunc eventFunc, HGPointer eventParam,
HGLibDeviceScanImageFunc imageFunc, HGPointer imageParam)
{
if (m_scanning)
{
return HGFALSE;
}
HGBase_CreateEvent(HGFALSE, HGFALSE, &m_scanEvent);
assert(NULL != m_scanEvent);
m_eventFunc = eventFunc;
m_eventParam = eventParam;
m_imageFunc = imageFunc;
m_imageParam = imageParam;
SANE_Status status = sane_start(m_devHandle);
if (SANE_STATUS_GOOD != status)
{
m_eventFunc = NULL;
m_eventParam = NULL;
m_imageFunc = NULL;
m_imageParam = NULL;
HGBase_DestroyEvent(m_scanEvent);
m_scanEvent = NULL;
return HGFALSE;
}
m_scanning = HGTRUE;
return HGTRUE;
}
HGBool HGLibDeviceImpl::StopScan()
{
if (!m_scanning)
{
return HGFALSE;
}
sane_cancel(m_devHandle);
assert(NULL != m_scanEvent);
HGBase_WaitEvent(m_scanEvent);
HGBase_DestroyEvent(m_scanEvent);
m_scanEvent = NULL;
m_eventFunc = NULL;
m_eventParam = NULL;
m_imageFunc = NULL;
m_imageParam = NULL;
m_scanning = HGFALSE;
return HGTRUE;
}
int HGLibDeviceImpl::sane_ex_callback(SANE_Handle hdev, int code, void* data, unsigned int* len, void* param)
{
switch (code)
@ -106,9 +252,6 @@ int HGLibDeviceImpl::sane_ex_callback(SANE_Handle hdev, int code, void* data, un
SANE_Device* sane_dev = (SANE_Device*)data;
HGBase_WriteInfo(HGBASE_INFOTYPE_DESC, "SANE_EVENT_DEVICE_LEFT, name=%s", Utf8ToStdString(sane_dev->name).c_str());
if (NULL != m_hotPlugEventFunc)
m_hotPlugEventFunc(HGLIB_DEVHOTPLUG_EVENT_REMOVE, sane_dev->name, m_hotPlugEventParam);
HGBase_EnterLock(m_lock);
for (int i = 0; i < (int)m_devNameList.size(); ++i)
{
@ -119,6 +262,83 @@ int HGLibDeviceImpl::sane_ex_callback(SANE_Handle hdev, int code, void* data, un
}
}
HGBase_LeaveLock(m_lock);
if (NULL != m_hotPlugEventFunc)
m_hotPlugEventFunc(HGLIB_DEVHOTPLUG_EVENT_REMOVE, sane_dev->name, m_hotPlugEventParam);
}
break;
case SANE_EVENT_WORKING:
{
HGBase_WriteInfo(HGBASE_INFOTYPE_DESC, "SANE_EVENT_WORKING, msg=%s", Utf8ToStdString((char*)data).c_str());
HGLibDeviceImpl* deviceImpl = m_deviceList[hdev];
if (NULL != deviceImpl->m_eventFunc)
{
deviceImpl->m_eventFunc((HGLibDevice)deviceImpl, HGLIB_DEVSCAN_EVENT_BEGIN,
HGFALSE, NULL, deviceImpl->m_eventParam);
deviceImpl->m_eventFunc((HGLibDevice)deviceImpl, HGLIB_DEVSCAN_EVENT_INFO,
HGFALSE, (const char*)data, deviceImpl->m_eventParam);
}
}
break;
case SANE_EVENT_SCAN_FINISHED:
{
HGBase_WriteInfo(HGBASE_INFOTYPE_DESC, "SANE_EVENT_SCAN_FINISHED, msg=%s", Utf8ToStdString((char*)data).c_str());
HGLibDeviceImpl* deviceImpl = m_deviceList[hdev];
if (NULL != deviceImpl->m_eventFunc)
{
deviceImpl->m_eventFunc((HGLibDevice)deviceImpl, HGLIB_DEVSCAN_EVENT_INFO,
(0 != *len), (const char*)data, deviceImpl->m_eventParam);
deviceImpl->m_eventFunc((HGLibDevice)deviceImpl, HGLIB_DEVSCAN_EVENT_END,
HGFALSE, NULL, deviceImpl->m_eventParam);
}
HGBase_SetEvent(deviceImpl->m_scanEvent);
}
break;
case SANE_EVENT_STATUS:
{
HGBase_WriteInfo(HGBASE_INFOTYPE_DESC, "SANE_EVENT_STATUS, msg=%s", Utf8ToStdString((char*)data).c_str());
}
break;
case SANE_EVENT_ERROR:
{
HGBase_WriteInfo(HGBASE_INFOTYPE_DESC, "SANE_EVENT_ERROR, msg=%s", Utf8ToStdString((char*)data).c_str());
}
break;
case SANE_EVENT_IMAGE_OK:
{
HGBase_WriteInfo(HGBASE_INFOTYPE_DESC, "SANE_EVENT_IMAGE_OK");
SANE_Image* sane_img = (SANE_Image*)data;
HGLibDeviceImpl* deviceImpl = m_deviceList[hdev];
if (NULL != deviceImpl->m_imageFunc)
{
HGUInt imgType = 0;
if (sane_img->header.format == SANE_FRAME_GRAY)
{
if (1 == sane_img->header.depth)
imgType = HGBASE_IMGTYPE_BINARY;
else if (8 == sane_img->header.depth)
imgType = HGBASE_IMGTYPE_GRAY;
}
else if (sane_img->header.format == SANE_FRAME_RGB)
imgType = HGBASE_IMGTYPE_RGB;
HGByte* data = sane_img->data;
HGImageInfo imgInfo = { (HGUInt)sane_img->header.pixels_per_line, (HGUInt)sane_img->header.lines,
imgType, (HGUInt)sane_img->header.bytes_per_line, HGBASE_IMGORIGIN_TOP };
HGImage img = NULL;
HGBase_CreateImageFromData(data, &imgInfo, NULL, 0, HGBASE_IMGORIGIN_TOP, &img);
if (NULL != img)
{
deviceImpl->m_imageFunc((HGLibDevice)deviceImpl, (HGLibImage)img, deviceImpl->m_imageParam);
HGBase_DestroyImage(img);
}
}
}
break;
}

View File

@ -3,9 +3,11 @@
#include "HGScannerLib.h"
#include "base/HGLock.h"
#include "base/HGEvent.h"
#include "sane/sane_ex.h"
#include "sane/sane_option_definitions.h"
#include <vector>
#include <map>
#include <string>
class HGLibDeviceImpl
@ -19,7 +21,7 @@ public:
static HGChar** GetNameList();
static HGBool ReleaseNameList(HGChar** deviceName);
HGBool Open(const HGChar* deviceName);
static HGLibDeviceImpl* Open(const HGChar* deviceName);
HGBool Close();
HGBool SetParam(const HGLibDeviceSetParam* param, HGUInt count);
HGLibDeviceGetParamGroup* GetParamGroupList(HGUInt* count);
@ -38,6 +40,17 @@ private:
static HGPointer m_hotPlugEventParam;
static HGBool m_init;
static std::vector<std::string> m_devNameList;
static std::map<SANE_Handle, HGLibDeviceImpl*> m_deviceList;
SANE_Handle m_devHandle;
std::string m_devName;
HGBool m_scanning;
HGEvent m_scanEvent;
HGLibDeviceScanEventFunc m_eventFunc;
HGPointer m_eventParam;
HGLibDeviceScanImageFunc m_imageFunc;
HGPointer m_imageParam;
};
#endif /* __HGLIBDEVICEIMPL_HPP__ */

View File

@ -115,41 +115,77 @@ HGBool HGAPI HGLib_ReleaseDeviceNameList(HGChar** deviceName)
HGLibDevice HGAPI HGLib_OpenDevice(const HGChar* deviceName)
{
return NULL;
return (HGLibDevice)HGLibDeviceImpl::Open(deviceName);
}
HGBool HGAPI HGLib_CloseDevice(HGLibDevice device)
{
return HGFALSE;
if (NULL == device)
{
return HGFALSE;
}
HGLibDeviceImpl* deviceImpl = (HGLibDeviceImpl*)device;
return deviceImpl->Close();
}
HGBool HGAPI HGLib_SetDeviceParam(HGLibDevice device, const HGLibDeviceSetParam* param, HGUInt count)
{
return HGFALSE;
if (NULL == device)
{
return HGFALSE;
}
HGLibDeviceImpl* deviceImpl = (HGLibDeviceImpl*)device;
return deviceImpl->SetParam(param, count);
}
HGLibDeviceGetParamGroup* HGAPI HGLib_GetDeviceParamGroupList(HGLibDevice device, HGUInt* count)
{
return NULL;
if (NULL == device)
{
return NULL;
}
HGLibDeviceImpl* deviceImpl = (HGLibDeviceImpl*)device;
return deviceImpl->GetParamGroupList(count);
}
HGBool HGAPI HGLib_ReleaseDeviceParamGroupList(HGLibDeviceGetParamGroup* paramGroup, HGUInt count)
{
return HGFALSE;
return HGLibDeviceImpl::ReleaseParamGroupList(paramGroup, count);
}
HGBool HGAPI HGLib_ResetDeviceParam(HGLibDevice device)
{
return HGFALSE;
if (NULL == device)
{
return HGFALSE;
}
HGLibDeviceImpl* deviceImpl = (HGLibDeviceImpl*)device;
return deviceImpl->ResetParam();
}
HGBool HGAPI HGLib_StartDeviceScan(HGLibDevice device, HGLibDeviceScanEventFunc eventFunc, HGPointer eventParam,
HGLibDeviceScanImageFunc imageFunc, HGPointer imageParam)
{
return HGFALSE;
if (NULL == device)
{
return HGFALSE;
}
HGLibDeviceImpl* deviceImpl = (HGLibDeviceImpl*)device;
return deviceImpl->StartScan(eventFunc, eventParam, imageFunc, imageParam);
}
HGBool HGAPI HGLib_StopDeviceScan(HGLibDevice device)
{
return HGFALSE;
if (NULL == device)
{
return HGFALSE;
}
HGLibDeviceImpl* deviceImpl = (HGLibDeviceImpl*)device;
return deviceImpl->StopScan();
}

View File

@ -146,7 +146,7 @@ HGEXPORT HGBool HGAPI HGLib_InitDevice(HGLibDeviceHotPlugEventFunc func, HGPoint
HGEXPORT HGBool HGAPI HGLib_DeinitDevice();
/* »ñȡɨÃèÒÇÃû³ÆÁбí */
HGEXPORT HGChar** HGAPI HGLib_GetDeviceNameList(HGUInt *count);
HGEXPORT HGChar** HGAPI HGLib_GetDeviceNameList();
/* Ïú»ÙɨÃèÒÇÃû³ÆÁбí */
HGEXPORT HGBool HGAPI HGLib_ReleaseDeviceNameList(HGChar** deviceName);

View File

@ -4033,8 +4033,6 @@ namespace ver_2
}
HGBase_EnterLock(p->m_lock);
if (NULL != p->m_saneEvent)
p->m_saneEvent(SANEEVENT_REMOVE, sane_dev->name, false, p->m_saneParam);
for (int i = 0; i < (int)p->m_devNameList.size(); ++i)
{
if (0 == strcmp(sane_dev->name, p->m_devNameList[i].c_str()))
@ -4043,6 +4041,8 @@ namespace ver_2
break;
}
}
if (NULL != p->m_saneEvent)
p->m_saneEvent(SANEEVENT_REMOVE, sane_dev->name, false, p->m_saneParam);
HGBase_LeaveLock(p->m_lock);
}
break;